5.4const對象


 

常成員函數

一個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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM