探究A和A& 類型到底是啥意思,沒做解析,勿進


 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 class A {
 6 public:
 7     int a = 1;
 8 public:
 9     int getRes() {
10         cout << this<<endl;  // this其實就是&dx了
11         return this->a;
12     }
13     // 總結:A類型(值類型)就表示這塊內存中的數據;A& 類型(引用類型)就是表示這塊內存的首地址+長度
14     // 因為this是A* 類型,所以*this就是A類型
15     A getRess() {
16         return *this; //  A tmp=*this;相當於我把這塊內存中的數據返回
17     }
18     A& getResss() {
19         return *this;  // return A& a=(*this);我把這塊空間的起始地址返回
20     }
21     
22 };
23 
24 int main() {
25     A dx;
26     
27    /* A& b = dx;
28     A* c = &dx;
29 
30     // 指針c可以取地址,但C++11規定this(A* const 類型)是右值,不能取地址,但gdb里面聽說可以取地址。(不同的編譯的差別吧)
31     // cout << dx << endl;    // A類型的不能直接輸出,A*才可以(反正都是地址),vs2019把引用也識別成指針類型...引用的底層到底是不是指針常量呢?
32     cout << &b << endl;
33     cout << &c << endl;
34     cout << c << endl;
35     int i = dx.getRes();*/
36     cout << &dx << endl;
37     // return應該會有賦值步驟,不然后d、e和dx的地址應該是一樣的
38     A d = dx.getRess();   // d中的數據就等於x(x表示dx中的數據),類似於初始化吧 int d=1;
39     A e = dx.getResss();  // 就是A& a=dx;A e=a;調用拷貝構造函數,類似於:int a=1; int e=a;
40     A& f = dx.getResss();  // 就是A& a=dx; 臨時變量a和dx的起始地址相同;然后A& f=a;f又和&a相同
41     cout << &d << " " << &e << " "<<&f<<endl;
42 
43     // 探究A 和 A&  = *this的不同
44     dx.a = 1;
45     // (dx.getRess()).a = 2;  // 不能這樣寫
46     // 原因:dx.getRess()這種產生的空間很快就會被銷毀,應該會被編譯器檢測到,然后不允許被賦值的吧
47     d.a = 2;
48     cout << dx.a << endl;
49     (dx.getResss()).a = 4;   // 會將dx.a改為4;回到++前置操作符,(++a)=2是合理的
50     e.a = 5;      // 不會將dx.a改為5
51     cout << dx.a << endl;
52     return 0;
53 }

 


免責聲明!

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



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