下面的代码是验证我是否在类中有一个指针成员,而不是重载赋值运算符.当我使两个实例相等时,它只会使指针指向同一个东西,而不是复制数据.但是,在我验证之前,我在尝试编译时遇到错误.在我看来,它暗示类中的指针成员必须指向堆分配的数据.这样对吗?
错误是:使用参数'aa'的堆栈地址初始化指针成员'a'[-Werror,-Wdangling-field]
第二个问题是我们什么时候需要一个重载的"="运算符?我想当我们在类中有一个指针成员时,我们希望再次复制指针指向的任何内容,而不是仅仅使两个类中的两个指针指向同一个东西.有人可以告诉我这是对的.谢谢!
class ClassA {
int* a;
int* b;
ClassA():a(NULL),b(NULL){};
ClassA(int aa,int bb):a(&aa),b(&bb){};
};
int main(){
ClassA test;
ClassA subject(5,6);
test = subject;
}
Run Code Online (Sandbox Code Playgroud)
不,没有什么可以说指针中包含的地址必须是具有动态存储持续时间的对象的位置,但是在使用堆栈上的变量地址初始化它们时要小心(具有自动存储持续时间).
正如你的编译器告诉你的; 您当前正在为类中的指针分配两个临时的地址.这意味着,在构造函数中完成,并且aa和bb不再是活着的,但你仍然有可能是指他们通过this->a和this->b.
如果您尝试使用*(this->a)并且*(this->b)当它们的指向对象不再可用时,您正在调用未定义的行为,这意味着您的应用程序很可能会崩溃,因为您尝试访问不再有效的内存.
operator=什么时候需要?这是有关stackoverflow的常见问题,我建议您阅读以下问题/答案: