天天看點

static關鍵字(C++)static關鍵字(C++)

static關鍵字(C++)

參考 https://blog.csdn.net/guotianqing/article/details/79828100#commentsedit

文章目錄

  • static關鍵字(C++)
    • 1. 靜态資料成員
      • 1.1 概念
      • 1.2 靜态資料成員的初始化和通路
      • 1.3 靜态資料成員的好處
    • 2. 靜态成員函數
      • 2.1 概念
      • 2.2 靜态成員函數調用
    • 3. sizeof 遇到類靜态資料成員

1. 靜态資料成員

1.1 概念

在類内資料成員的聲明前加上 static 關鍵字,該資料成員就是類内的靜态資料成員。其特點如下:

靜态資料成員存儲在全局資料區,靜态資料成員在定義時配置設定存儲空間,是以不能在類聲明中定義

靜态資料成員是類的成員,無論定義了多少個類的對象,靜态資料成員的拷貝隻有一個,且對該類的所有對象可見。也就是說任一對象都可以對靜态資料成員進行操作。而對于非靜态資料成員,每個對象都有自己的一份拷貝。

和普通資料成員一樣,靜态資料成員也遵從 public, protected, private 通路規則

由于上面的原因,靜态資料成員不屬于任何對象,在沒有類的執行個體時(

執行個體就是建立對象

)其作用域就可見,在沒有任何對象時,就可以進行操作。

1.2 靜态資料成員的初始化和通路

靜态資料成員的初始化格式:<資料類型><類名>::<靜态資料成員名>=<值>

int Myclass::sum = 0; //在類外進行初始化,不需要也不允許再加 static 關鍵字

類的 公有靜态資料成員(

私有靜态資料成員隻能通過類的方法通路

)有兩種通路方式:

<類對象名>.<靜态資料成員名> 或 <類類型名>::<靜态資料成員名>

class Myclass

{

static int sum;

};

int x = Myclass::sum; //通過類名通路

Myclass M;

int y = M.sum; //通過類對象通路

1.3 靜态資料成員的好處

同全局變量相比,使用靜态資料成員有兩個優勢:

  1. 靜态資料成員沒有進入程式的全局名字空間,是以不存在與程式中其它全局名字沖突的可能性
  2. 可以實作資訊隐藏。靜态資料成員可以是 private 成員,而全局變量不能

2. 靜态成員函數

2.1 概念

公有的靜态資料成員可以直接通路,但私有的或保護的靜态資料成員卻必須通過公有的接口進行通路,一般将這個公有的接口定義為靜态成員函數。

在類中的 static 成員函數屬于整個類所擁有,這個函數 不接受 this 指針 (靜态成員函數并不屬于任一對象,是以,自然也不能通路非晶态資料成員),隻能通路類的 static 成員變量和調用靜态成員函數。如果想要通路非靜态成員,可以通過對象來引用。

靜态成員函數可以在類體内定義,也可以在類體外定義。當在類外定義時要注意不要加 static 關鍵字作字首。

2.2 靜态成員函數調用

和靜态資料成員一樣,靜态成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜态成員函數,要用類名和域運算符“∷”

非靜态成員函數可以任意地通路靜态成員函數和靜态資料成員

私有靜态成員函數不能通過類名調用,隻能被其他靜态函數調用。

示例代碼

#include <iostream>
using namespace std;
class M
{
public:
	M(int a){ m_a = a; ms_b += a;} //構造函數
	static void f1(M m);           //公有靜态成員函數
private:
	int m_a;
static int ms_b;                   //私有靜态成員變量
};

int M::ms_b = 0;				   //靜态資料初始化  					

void M::f1(M m) //靜态成員函數體
{
	cout << "A=" << m.m_a <<endl;      //通過對象引用非靜态成員
	cout << "B=" << ms_b << endl;      //直接引用靜态資料成員
}

int main()
{
	M P(5);
	M::f1(P);
	return 0;
}
           

3. sizeof 遇到類靜态資料成員

sizeof 計算的是堆棧空間中的區域,是以對于類中的靜态成員占據的空間是不計算的

#include <iostream>
using namespace std;

class Myclass
{
public:
    Myclass (int a,int b);
private:
    int m_a;
    int m_b;
    static int sum;
};

int Myclass::sum = 0;

Myclass::Myclass(int a,int b)
{
    m_a = a;
    m_b = b;
}

int main()
{
    Myclass M(3,7);
    cout << sizeof(M);  //結果為8
}
           
c++

繼續閱讀