常成員函數
一個const對象可以調用const函數,但不能調用非const成員函數。必須將關鍵字const放在函數參數表之后,才能說明該函數是一個const成員函數。
聲明常成員函數的格式如下:
類型標識符 函數名(參數列表) const;
定義定義如下:
類型標識符 類名::函數名(參數列表) const {//函數體}
在類中定義定義如下:
類型標識符 函數名(參數列表) const {//函數體}
在常成員函數里,不能更新對象的數據成員,也不能調用該類中沒有用const修飾的成員函數。如果將一個對象說明為常對象,則通過該對象只能調用它的const成員函數,不能調用其他成員函數。
//error: C3490: 由於正在通過常量對象訪問“x”,因此無法對其進行修改
//error: C3490: 由於正在通過常量對象訪問“y”,因此無法對其進行修改
加上const屬性,不可修改一般的成員變量
1 void Dialog::getxy() const 2 { 3 this->x=900;//error: C3490: 由於正在通過常量對象訪問“x”,因此無法對其進行修改 4 this->y=600;//error: C3490: 由於正在通過常量對象訪問“y”,因此無法對其進行修改 5 }
常量數據成員一旦初始化以后,不會讀內存,從代碼區的符號表自動生成。
//error C2789: “myclass::coint”: 必須初始化常量限定類型的對象
//error C2530: “myclass::myint”: 必須初始化引用
1 #include <iostream> 2 3 class myclass 4 { 5 public: 6 int num; 7 int data; 8 int *p; 9 10 //error C2789: “myclass::coint”: 必須初始化常量限定類型的對象 11 const int coint;//常量數據成員 12 13 //error C2530: “myclass::myint”: 必須初始化引用 14 int & myint;//引用 15 16 static int shu;//靜態數據成員 17 public: 18 static void go() 19 { 20 21 } 22 void run() 23 { 24 25 } 26 myclass(int, int);//構造函數,常量限定類型的對象、引用必須重載構造函數初始化 27 ~myclass() 28 { 29 30 } 31 }; 32 33 int myclass::shu = 0;//初始化靜態數據成員 34 35 myclass::myclass(int a, int b) :myint(a), coint(b)//構造函數 36 { 37 38 } 39 40 void main() 41 { 42 43 system("pause"); 44 }
//引用就是共用地址,常量新開辟備份機制
//常量const在類的外部,一開始必須初始化,在代碼區
//常量const在類的內部,先構建一個類的對象才能初始化,在棧或者堆
//類中的普通成員變量,類名::變量名,在棧上
//類名 *指針名=new 類名,在堆上
//類的靜態成員變量,在靜態區
//函數都在代碼區,類的函數、靜態函數都是共享的
//引用本質就是變量的別名,4個字節,本質是指針
1 #include <iostream> 2 3 class myclass 4 { 5 public: 6 int num; 7 int data; 8 int *p; 9 10 //error C2789: “myclass::coint”: 必須初始化常量限定類型的對象 11 const int coint;//常量數據成員 12 13 //error C2530: “myclass::myint”: 必須初始化引用 14 int & myint;//引用 15 16 static int shu;//靜態數據成員 17 public: 18 static void go()//靜態成員函數 19 { 20 21 } 22 void run() 23 { 24 25 } 26 myclass(int, int);//構造函數,常量限定類型的對象、引用必須重載構造函數初始化 27 ~myclass() 28 { 29 30 } 31 }; 32 33 int myclass::shu = 0;//初始化靜態數據成員 34 35 myclass::myclass(int a, int b) :myint(a), coint(b)//構造函數 36 { 37 //引用就是共用地址,常量新開辟備份機制 38 //常量const在類的外部,一開始必須初始化,在代碼區 39 //常量const在類的內部,先構建一個類的對象才能初始化,在棧或者堆 40 std::cout << &a << " " << &b << std::endl; 41 std::cout << &myint << " " << &coint << std::endl; 42 } 43 44 //類中的普通成員變量,類名::變量名,在棧上 45 //類名 *指針名=new 類名,在堆上 46 //類的靜態成員變量,在靜態區 47 //函數都在代碼區,類的函數、靜態函數都是共享的 48 49 //引用本質就是變量的別名,4個字節,本質是指針 50 51 void main() 52 { 53 myclass myclass1(10, 9);//初始化一個對象 54 55 system("pause"); 56 }
//靜態常數據成員在靜態區
static const int dashu;//靜態常數據成員
const int myclass::dashu = 20;//初始化靜態常數據成員
1 #include <iostream> 2 3 class myclass 4 { 5 public: 6 int num; 7 int data; 8 int *p; 9 10 //error C2789: “myclass::coint”: 必須初始化常量限定類型的對象 11 const int coint;//常量數據成員 12 13 //error C2530: “myclass::myint”: 必須初始化引用 14 int & myint;//引用 15 16 static int shu;//靜態數據成員 17 18 //靜態常數據成員在靜態區 19 static const int dashu;//靜態常數據成員 20 public: 21 static void go()//靜態成員函數 22 { 23 24 } 25 void run() 26 { 27 28 } 29 myclass(int, int);//構造函數,常量限定類型的對象、引用必須重載構造函數初始化 30 ~myclass() 31 { 32 33 } 34 }; 35 36 int myclass::shu = 0;//初始化靜態數據成員 37 const int myclass::dashu = 20;//初始化靜態常數據成員 38 39 myclass::myclass(int a, int b) :myint(a), coint(b)//構造函數 40 { 41 42 } 43 44 void main() 45 { 46 47 system("pause"); 48 }
常對象
常成員函數
一個const對象可以調用const函數,但不能調用非const成員函數。
//mutable是不受const約束的類成員
//常對象不可以引用非const成員函數
//error C2662: “void area::add(int)”: 不能將“this”指針從“const area”轉換為“area &”
1 #include <iostream> 2 3 class area 4 { 5 public: 6 int x; 7 int y; 8 mutable int z;//mutable是不受const約束的類成員 9 area() :x(10), y(10) 10 { 11 12 } 13 void printxy() const//常成員函數 14 { 15 std::cout << x << " " << y << " " << z << std::endl; 16 } 17 void add(int a)//非const成員函數 18 { 19 x += a; 20 y += a; 21 } 22 void go()//非const成員函數 23 { 24 25 } 26 protected: 27 private: 28 }; 29 30 void main() 31 { 32 const area area1;//常對象不可以引用非const成員函數 33 34 area1.printxy(); 35 36 area1.add(1);//error C2662: “void area::add(int)”: 不能將“this”指針從“const area”轉換為“area &” 37 38 area1.go();//error C2662: “void area::go(void)”: 不能將“this”指針從“const area”轉換為“area &” 39 40 system("pause"); 41 }