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

指针和副本 我从C++开始,我对指针和它的复制有一些疑惑。,c++,reference,copy,C++,Reference,Copy,我将写一个例子: class Abc{ Qwe q; } Abc* a = new Abc(); Abc* b = new Abc(); b->q = a->q; //?? 那次任务发生了什么?“a”是否给“b”一份“q”的副本 问题是我希望两个指针都有不同的“q”,但我不知道如何复制它。就像例子中那样 谢谢您有未定义的行为,因为您正在取消对未初始化指针的引用。那些指针实际上还没有指向任何地方。您需要为它们创建一些要指向的对象。一种方法是: Abc a_object; Abc

我将写一个例子:

class Abc{
  Qwe q;
}

Abc* a = new Abc();
Abc* b = new Abc();
b->q = a->q; //??
那次任务发生了什么?“a”是否给“b”一份“q”的副本

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


谢谢

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

Abc a_object;
Abc b_object;
Abc* a = &a_object;
Abc* b = &b_object;
完成此操作后,赋值表达式将把
a->q
复制到
b->q
。具体发生什么取决于
Qwe
的定义(它可以简单地复制
a->q
的值或调用复制赋值操作符)


如果你的类中有一个
Qwe*
,那么你只是在复制指针,而不是它指向的对象。C++默认值语义,这意味着复制的东西。即使复制一个指针以便获得指向原始对象的另一个指针,您仍然在复制该指针。你所需要做的就是看一下作业右侧的内容,以确定要复制的内容。这里我们可以看到它是
a->q
,我们知道
a->q
Qwe
,所以
Qwe
对象被复制。

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

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


另外,我假设您在取消引用对象之前为对象分配了
a
b
一些有效指针。

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

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

我忘了指针的新的。那么,q被复制了?两者在内存中的位置是否不同?@Frion3L是的,
a_对象
有自己的
q
,而
b_对象
有自己的
q
。作业将
q
从一个复制到另一个。另一个相关问题是:如果我删除“a”,会发生什么?它的“q”会被删除,对吗?或者是在记忆中?同样的问题,但用q作为指针?谢谢@Frion3L
q
a
指向的对象的一部分。一旦物体被摧毁,它就不可能存在<代码>删除一个销毁
Abc
对象及其所有成员(其中只有一个,
q
)。如果
q
是指针,则执行
删除a->q
将破坏
q
指向的对象,仅此而已。