靜態方法

C++中,若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為實例方法。靜態方法為類所有,可以通過對象來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的實例就可使用。靜態方法只能調用靜態變數。

基本介紹

  • 中文名:靜態方法
  • 外文名:A static method
  • 定義:若類的方法前加了static關鍵
  • 注意事項:與“非靜態方法”區別
定義,方法使用,方法聲明,方法調用,方法規則,代碼示例,實際套用,經典案例,優勢與弊端,

定義

若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為非靜態方法。

方法使用

靜態方法與靜態變數一樣,屬於本身,而不屬於那個類的一個對象。調用一個被定義為static的方法,可以通過在它前面加上這個類的名稱,也可以像調用非靜態方法一樣通過類對象調用。
實例方法必須通過類的實例來使用。實例方法可以使用類的非靜態成員,也可以使用類的靜態成員。
類的靜態方法,靜態變數是在類裝載的時候裝載的。但是要特別注意,類的靜態變數是該類的對象所共有的,即是所有對象共享變數。所以建議儘量少用靜態變數。儘量在靜態方法中使用內部變數。

方法聲明

其中static關鍵字即表示靜態的。聲明靜態方法的語法如下:
<訪問修飾符>static返回類型 方法名(參數列表)
{//方法體}

方法調用

靜態方法與實例方法唯一不同的,就是靜態方法在返回類型前加static關鍵字。靜態方法的調用有兩種途徑:
(1)通過類的實例對象去調用
調用格式為: 對象名.方法名
(2) 通過類名直接調用
調用格式為: 類名::方法名

方法規則

我們在使用時要注意:
靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;
非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;
靜態方法既可以用實例來調用,也可以用類名來調用

代碼示例

#include<iostream>
using namespace std;
class CStaticTest{
public:
CStaticTest(int a)
{
this->a = a;
}
~CStaticTest(){}
static int add(CStaticTest& c1, CStaticTest& c2)
{
return c1.a + c2.a;
}
private:
int a;
};
int main()
{
CStaticTest tmp1(1);
CStaticTest tmp2(2);
int sum1 = tmp1.add(tmp1, tmp2);
int sum2 = CStaticTest::add(tmp1, tmp2);
cout << sum1 << endl;
cout << sum2 << endl;
return 0;
}

實際套用

1. 有靜態屬性的類,一般會定義靜態方法。
2. 沒有屬性的類,一般會定義靜態方法,這樣在使用時,通過類名::方法名即可調用,
而不用先定義對象,再調用,這樣可以省去一行代碼。

經典案例

(1)用於對靜態欄位、唯讀欄位等的初始化。
(2)添加static關鍵字,不能添加訪問修飾符,因為靜態構造函式都是私有的。
(3)類的靜態構造函式在給定應用程式域中至多執行一次:只有創建類的實例或者引用類的任何靜態成員才激發靜態構造函式
(4)靜態構造函式是不可繼承的,而且不能被直接調用。
(5)如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函式將在調用 Main方法之前執行。任何帶有初始值設定項的靜態欄位,則在執行該類的靜態構造函式時,先要按照文本順序執行那些初始值設定項。
(6)如果沒有編寫靜態構造函式,而這時類中包含帶有初始值設定的靜態欄位,那么編譯器會自動生成默認的靜態構造函式。
以下用例子代碼進一步說明:
using System;
class A { public static int X; static A()
④ 執行完後返回到③ { X = B.Y + 1; Console.WriteLine("static A()"); } }class B { public static int Y = A.X + 1③ 調用了A的靜態成員, 轉到A的靜態構造函式----> static B()
② 如果帶有初始值設定項的靜態欄位,執行該類的靜態構造函式時,
先要按照文本順序執行那些初始值設定項。
轉到初始值設定項----> { Console.WriteLine("staticB()"); } static void Main()
① 程式入口,
如果類中包含用來開始執行的 Main 方法,
該類的靜態構造函式將在調用 Main 方法之前執行。
轉到B的靜態構造函式----> { Console.WriteLine("X = {0},Y = {1}", A.X, B.Y);
⑤ 輸出結果 Console.ReadLine(); } }

優勢與弊端

在一些系統中使用非常頻繁的方法都使用靜態方法可以提高系統性能
本身不可升級,重寫,這要看一個軟體產品的目的是什麼了.
為了方便,不用實例化,但這樣程式編譯運行時就占用了系統資源
靜態的屬性和方法在程式啟動的時候,就全部裝入記憶體的,而不管這些方法、屬性以後有沒有用到。即使是沒有人再訪問程式,這部分記憶體仍然不會釋放。還有就是,所有訪問者看到的靜態屬性的數據幾乎都是一樣的,比如A用戶設定了UserName這個屬性,B用戶訪問的時候,得到的UserName仍然是A用戶設定的那個。這種特性,如果用在固定數據中,那不會有太大問題,比如連線字元串之類的。

相關詞條

熱門詞條

聯絡我們