0

我从 C++ 开始,我对指针和它的副本有一些疑问。

我要写一个例子:

class Abc{
  Qwe q;
}

Abc* a = new Abc();
Abc* b = new Abc();
b->q = a->q; //??

那个任务会发生什么?'a' 是否将 'q' 的副本提供给 'b'?

问题是我希望两个指针都有不同的“q”,但我不知道如何复制它。是不是像例子中的那样?

谢谢

4

3 回答 3

6

您有未定义的行为,因为您正在取消引用未初始化的指针。这些指针实际上还没有指向任何地方。您需要创建一些Abc对象以供它们指向。一种方法是:

Abc a_object;
Abc b_object;
Abc* a = &a_object;
Abc* b = &b_object;

完成此操作后,您的赋值表达式将复制a->qb->q. 究竟会发生什么取决于Qwe(它可以简单地复制值a->q或调用复制赋值运算符)的定义。

相反,如果您的类中有一个Qwe*,您将只是复制该指针而不是它指向的对象。C++ 默认为值语义,这意味着事物是被复制的。即使您复制一个指针以便获得另一个指向与原始对象相同的对象,您仍然在复制该指针。要确定正在复制的内容,您需要做的就是查看作业右侧的内容。在这里我们可以看到它是a->q并且我们知道它a->q是一个Qwe所以Qwe对象被复制了。

于 2013-04-16T14:50:37.977 回答
4

在这种情况下,您正在访问未分配的指针,因此未定义结果

class Abc{
  Qwe q;
}

Abc* a = new Abc();
Abc* b = new Abc();

b->q = a->q; //This would now invoke the copy assignment or the copy constructor (depending
             // on what the compiler want to do) of class Qwe

如果你想控制发生的事情,你应该为 Abc 定义一个复制构造函数和一个复制赋值运算符

于 2013-04-16T14:52:13.933 回答
2

答案取决于Qwe. 如果它是普通类型,则将调用其赋值运算符,它将以特定于您的类的方式进行复制(默认情况下,这是原始类型的简单复制,然后是非原始类型的复制构造函数)。

如果Qwetypedef-ed 指针类型,则将制作该指针的副本。

PS我假设您在取消引用它们之前分配ab一些指向对象的有效指针。

于 2013-04-16T14:51:21.840 回答