常量:對於既需要共享、又需要防止改變的數據。在程序運行期間不可改變。
const 修飾的是對象中的 this 指針。所以不能被修改。
this指針存在於類的成員函數中,指向被調用函數所在的類實例的地址。
1、常對象
數據成員值在對象的整個生存期內不能改變。在定義時必須初始化,而且不能被更新。
常對象,只能調用常成員函數,保證常對象的數據成員不被改變。
class point { public: point(int i, int j) { x = i, y = j; } private: int x, y; }; // 定義常對象 point const a(3, 4); // 定義時,初始化
2、常成員變量
常數據成員,一經初始化就不可改變。構造函數對其進行初始化,只能通過初始化列表。
通常把常數據成員定義為靜態成員,使其成為類的一個常量。
初始化實例:
class circle { public: circle(int r, int i); void print(); private: int ri; const int a; static const float pi; //靜態常數據成員 }; // //靜態常數據成員,類外初始化 const float circle::pi = 3.14; // 常數據成員只能通過初始化列表,獲得初值 // a 為常成員數據,不能把 a=i 寫到構造函數體內,必須通過初始化列表獲取初值 // 普通成員也可在初始化列表中賦值 circle::circle(int r, int i) :a(i), ri(r) { } void circle::print() { cout << ri << endl; } void main() { circle x(100, 0); x.print(); system("pause"); return; }
3、常成員函數
const修飾常成員函數,寫在什么位置沒有關系。
修飾的是this 指針所指向的內存空間,不可以改變。
void OpVar(int a, int b) const { a = 100; this->b = 200;// 會報錯,不可更改 }
class R { public: R(int ra, int rb) { r1 = ra; r2 = rb; } void change(int, int); void print() const; // 定義常成員函數 private: int r1, r2; }; void R::change(int a, int b) { r1 = a; r2 = b; } void R::print() const { cout << r1 << ", " << r2 << endl; } void main() { R a(5, 4); a.print(); // 調用常成員函數 print() // 定義常對象,不可調用普通函數 change() const R b(20, 25); b.print();// 調用常成員函數 print() system("pause"); return; }
