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 }