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 }