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