以下代码用于验证我是否在类中有指针成员,而不进行重载赋值运算符。当我使两个实例相等时,它只会使指针指向同一个东西,而不是复制数据。但是,在我验证之前,我在尝试编译时遇到错误。在我看来,它暗示类中的指针成员必须指向堆分配的数据。这样对吗?
错误是:使用参数'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;
}
答案 0 :(得分:5)
否,没有任何说明指针中包含的地址必须是具有动态存储时间的对象的位置,但请注意使用堆栈上的变量地址初始化它们(具有自动存储持续时间)。
正如你的编译器告诉你的那样;您当前正在将两个 temporaries 的地址分配给您班级中的指针。这意味着在构造函数完成后,aa
和bb
不再存在,但您仍然可以通过this->a
和this->b
引用它们。
如果您的指向对象不再可用时尝试使用*(this->a)
和*(this->b)
,则表示您正在调用未定义的行为,意味着您的应用程序很可能会崩溃,因为您正在尝试访问不再有效的内存。
operator=
?这是关于stackoverflow的常见问题,我建议您阅读以下问题/答案:
答案 1 :(得分:1)
这条线看起来不太好:
ClassA (int aa, int bb) : a(&aa), b(&bb) {};
参数是普通整数,因此它们是按值进行的,这意味着只要构造函数范围存在,它们的副本就存在于堆栈中。然后他们就走了。你的指针现在指向未分配的内存,因此取消引用会导致段错误。
至于你的第二个问题,请阅读this thread,它为作业运营商提供了一个很好的解释。