指针和副本

Pointers and copies

本文关键字:副本 指针      更新时间:2023-10-16

我从c++开始,我对指针和它的复制有一些疑问。

我要写一个例子:

class Abc{
  Qwe q;
}
Abc* a = new Abc();
Abc* b = new Abc();
b->q = a->q; //??

赋值中发生了什么?"a"给了"b"一个"q"的副本吗?

问题是我想对两个指针有不同的'q',我不知道如何复制它。就像刚才的例子一样?

谢谢

你有未定义的行为,因为你解引用一个未初始化的指针。这些指针还没有指向任何地方。您需要创建一些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->qQwe,所以Qwe对象被复制了

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

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定义复制构造函数和复制赋值操作符

答案取决于Qwe的类型。如果它是一个普通类型,那么将调用它的赋值操作符,它将以特定于您的类的方式进行复制(默认情况下,这是对原语的简单复制,然后是非原语的复制构造函数)。

如果Qwetypedef -ed指针类型,则复制该指针。

注:我假设您在解引用对象之前为ab分配了一些有效的指针。