我从C ++开始,我对指针有一些疑问,而且它是副本。
我打算写一个例子:
class Abc{
Qwe q;
}
Abc* a = new Abc();
Abc* b = new Abc();
b->q = a->q; //??
该作业会发生什么? 'a'是否将'q'的副本提供给'b'?
问题是我想对两个指针都有不同的'q',我不知道如何复制它。就像在例子中一样?
由于
答案 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->q
是Qwe
,因此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>
如果Qwe
是typedef
- ed指针类型,则会生成该指针的副本。
P.S。我假设您在解除引用之前已为a
和b
分配了一些有效的指针。