与 C++ 复制构造函数相关的查询
c++ copy constructor related query
#include<iostream>
class A{
public :
int a;
};
int main(){
A obj;
obj.a = 5;
A b(obj);
b.a = 6;
std::cout<<obj.a;
return 0;
}
为什么答案返回为 5 ,默认情况下,C++ 中的复制构造函数返回一个浅拷贝。 浅拷贝不是意味着参考吗?还是我错过了什么?
浅拷贝意味着参考?? 还是我错过了什么?
你错过了一些东西。浅拷贝意味着复制。它将对象的所有成员从一个复制到另一个。它不是参考。创建的副本完全独立于原始副本
请参阅此优秀教程,了解浅拷贝和深拷贝之间的区别。
b
是一个与obj
完全独立的对象。它有自己的a
独立于obj
的。
听起来您想到的是一个参考:
A& b = obj;
在此之后,b
和obj
都引用同一个对象。通过b
所做的更改将通过obj
可见,反之亦然。
浅拷贝意味着参考?? 还是我错过了什么?
是的,你错过了一些东西。
浅拷贝并不意味着参考。浅拷贝意味着复制成员:如果成员是指针,那么它复制地址,而不是指针指向的内容。这意味着,原始对象中的指针和所谓的复制对象指向内存中的相同内容。这称为浅拷贝。另一方面,深拷贝不会复制地址,它会创建一个新指针(在新对象中),为其分配内存,然后复制原始指针指向的内容。
在您的情况下,浅拷贝和深拷贝没有区别,因为类中没有指针成员。每个成员都被复制(像往常一样),并且由于没有成员是指针,因此每个复制的成员都是内存中的不同成员。也就是说,原始对象和复制的对象是内存中完全不同的对象。这两个对象绝对没有任何共享的内容。因此,当您修改一个时,它根本不会更改另一个中的任何内容。
是的,默认复制构造函数是浅拷贝。在此处查看更多内容
但是,b与a完全不相交,所以这两件事没有直接关系。
A b(obj)
obj
信息复制到新创建的对象b
中。是的,它是一个浅拷贝,因此b
实际上并不控制分配给它的内容。您可能正在考虑的是一个参考:
A& b = obj;
b.a = 6;
std::cout << obj.a; // 6
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 超简单C++构造函数查询
- 与 C++ 复制构造函数相关的查询