我正在浏览引用变量概念,并发现声明为引用的类的成员变量必须使用初始化列表在构造函数中初始化。但是在后续代码中,我声明了一个指向该类的指针,并稍后将值赋给参考varibales。任何人都可以解释我在后台发生的事情。为什么它没有给出错误,因为我没有对成员引用变量进行初始化。
#include <iostream>
using namespace std;
class A
{
public:
int &a;
int &b;
A(int &a, int &b):a(a),b(b){}
};
int main(){
A *p;
p->a = 100;
p->b = 200;
cout<<"a:"<<p->a<< "b:"<<p->b<<endl;
return 0;
}
答案 0 :(得分:1)
您只能初始化一次参考。无论是否是班级成员,这都没有区别:
int a;
int& b = a; // <- initialize the reference
int& c; // NOT OK, references have to be initialized to reference something
以后的任何赋值都不会更改引用引用的变量,但会更改该变量的值:
int c = 3;
b = c; // now a==3 but b is still a reference to a
请注意,您的代码存在一些与您的问题无关的严重问题。它已在评论中提及,但为了完整起见:您永远不会创建一个对象,并且您取消引用导致未完成行为的无效指针。
PS :我再次阅读了这个问题并意识到代码中的问题实际上与问题有关。
当我们声明一个指向具有成员变量作为参考的类的对象的指针时,后台会发生什么?
对此的答案相当简单和简短:后台没有任何事情发生。当你声明一个指针时,你真的只是声明了一个指针。声明指针涉及创建一个对象,如有一张纸,你可以写一个房子的地址来建房子。但是,如果你只是宣布一个指针,你既不知道地址,也不建造房屋。
无论如何,当我查看你的代码时,我只能建议你远离动态分配,而只是这样做:
int main(){
int a,b;
A p = A(a,b);
p.a = 100;
p.b = 200;
cout<<"a:"<<a<< "b:"<<b<<endl;
return 0;
}