曾格的github

探究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 }

 

posted @ 2021-11-10 22:23  曾格  阅读(875)  评论(0编辑  收藏  举报
Live2D