指针和副本

时间:2013-04-16 14:47:52

标签: c++ reference copy

我从C ++开始,我对指针有一些疑问,而且它是副本。

我打算写一个例子:

class Abc{
  Qwe q;
}

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

该作业会发生什么? 'a'是否将'q'的副本提供给'b'?

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

由于

3 个答案:

答案 0 :(得分:6)

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

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->qQwe,因此Qwe对象被复制。

答案 1 :(得分: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

定义复制构造函数和复制赋值运算符

答案 2 :(得分:2)

答案取决于Qwe的类型。如果它是普通类型,则将调用其赋值运算符,它将以特定于您的类的方式执行复制(默认情况下,这是基元的简单副本,后跟非基元的复制构造函数)。 / p>

如果Qwetypedef - ed指针类型,则会生成该指针的副本。

P.S。我假设您在解除引用之前已为ab分配了一些有效的指针。