天天看點

C++ const 和 static 成員const資料成員const 成員函數static 資料成員static 成員函數

const資料成員

  • 定義一個常量,企圖修改這個值會導緻編譯錯誤,必須在定義時初始化。
  • 不允許将const 位址指派給非const 指針。
  • const 指針指向const 對象時,本身位址不能變,但是指向的位址可以變化。
  • const 指針指向非const 對象時,指向的位址不能變,但是指向對象的值可以變。
int main()
{
	int const a = 1,b = 2;
	int c = 3;
	int const *p = &a, *q = &c; //*p = 1;*q = 3;
	p = &b; c = 4;  // *p = 2; *q = 4;
	return 0;
}
           

const 成員函數

  • 一個類的對象也可以用const 限定為常量。
  • 隻有聲明為const 的成員函數才可以被const 對象調用。
  • 聲明const 成員函數的形式:

    傳回類型 \quad 成員函數名(參數表) const;

  • 定義const 成員函數形式:

    傳回類型 \quad 成員函數名(參數表) const { 函數體 }

  • const 成員函數不能修改類的資料成員,也不能調用其他非const 成員函數。
  • 其他成員函數可以調用const 成員函數。
  • const 成員函數隐含的this 指針是const X*
class X {
	int m;
public:
	X(int v = 0):m(v){}
	void set(int v){ m = v; }
	int get() const { return m; }
};
int main()
{
	const X b(5);
	cout<<b.get()<<endl;
	return 0;
}
           

static 資料成員

  • 類的靜态資料成員在整個類中隻有一份,被這個類的所有對象所共同通路。從邏輯上講,靜态成員屬于類,非靜态成員屬于對象。
  • 靜态資料成員沒有進入程式的全局作用域隻是在類的作用域中。
  • 靜态資料成員存放于靜态存儲區,由類所有對象共享,生命周期不依賴于對象。
  • 由于static 資料成員不是某個特定對象的,因而不能在構造函數中初始化,應該在類定義之外初始化。初始化時要使用類名限定,但是不用出現static關鍵字。
  • 靜态資料成員的通路
    • 成員通路運算符“ . ”或“ -> ”,通過對象或指針通路。
    • 直接用類名字限定的靜态成員名字通路。
#include <iostream>
using namespace std;
class X{
	static int count;
	int m;
public:
	X(int mm = 0){ count++; m = mm;}
	X(const X& a){ count++; m = a.m;}
	~X() { count--;}
	int getCount(){ return count;}
};
int X::count = 0; 
int main()
{
	X a(5),b;
	X c = a;
	cout<<"a.count="<<a.getCount()<<" b.count="<<b.getCount()<<endl;
	X d = b;
	cout<<"count變為"<<a.getCount()<<endl;
	return 0;
}
           
C++ const 和 static 成員const資料成員const 成員函數static 資料成員static 成員函數

static 成員函數

  • 如果成員函數隻通路靜态資料成員,那麼用哪個對象調用這個函數都沒有關系。這樣的函數成員可以聲明為靜态成員函數。
  • 靜态成員函數的聲明在類定義中,加static 關鍵字,在類外定義靜态成員函數時不需要static 關鍵字。
  • 靜态成員函數可以用成員通路,也可以直接用類名限定函數名調用。
  • 靜态成員函數沒有預設this 指針,是以不能通路非靜态成員,也不能調用非靜态成員函數。

繼續閱讀