指针和副本
Pointers and copies
我从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->q
到b->q
。具体发生什么取决于Qwe
的定义(它可以简单地复制a->q
的值或调用复制赋值操作符)。
如果在你的类中有一个Qwe*
指针,你只是复制了那个指针,而不是它所指向的对象。c++默认为值语义,这意味着东西会被复制。即使当你复制一个指针以得到另一个指针指向与原来的指针相同的对象时,你仍然是在复制指针。你所要做的就是识别哪些是被复制的,看看作业右边的内容。这里我们可以看到它是a->q
,我们知道a->q
是Qwe
,所以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
的类型。如果它是一个普通类型,那么将调用它的赋值操作符,它将以特定于您的类的方式进行复制(默认情况下,这是对原语的简单复制,然后是非原语的复制构造函数)。
如果Qwe
是typedef
-ed指针类型,则复制该指针。
注:我假设您在解引用对象之前为a
和b
分配了一些有效的指针。
相关文章:
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 指向基类的指针的 std::vector 的深层副本
- 如何让指针的深层副本将内部结构发送到内核?
- 带有随机指针的链表的深层副本
- 属于副本被推送到矢量的对象的指针会发生什么情况?
- 当我修改、更改和“删除”原始指针时,是否需要指针副本
- 我们如何在 C 中制作函数指针的深层副本
- 我如何创建一个双重指针的深层副本,涉及其他类(C )
- 在C++中制作此指针的本地副本
- 复制指针,在不更改原始指针的情况下更改副本指向的内容?
- 取消引用指针以创建数组的副本
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 如何使智能指针指向对象的副本
- 如果给出了该课程的指针,则深入应对以制作课程的副本
- C 指针深副本
- 对象或常量指针的副本
- C++:创建指针的副本
- 矢量和指针队列数据交换:深层和浅层副本
- 结构中的 CUDA 设备功能指针,没有静态指针或符号副本
- C++中的构造函数副本、列表、指针和模板