(c++)赋值操作符与复制构造函数:when都隐式使用
(C++) assignment operator vs copy constructor: when is each used implicitly
如果我错了,请纠正我,但我的理解是,当你这样做时使用复制构造函数:
myClass newInstant = oldInstant;
,而赋值操作符则用于以下操作:
myClass newInstant;
newInstant = oldInstant;
我相信两者都达到了相同的结果,但第一个更直接,因为它避免了先使用构造函数然后复制新数据。
我不确定的是,当传递一个函数时,它是使用复制构造函数还是使用赋值操作符复制的。另外,当从函数返回一个瞬间时使用。
一般来说,在哪些情况下使用复制构造函数和赋值操作符?
最后一个问题,我如何返回一个值而不复制它?如果返回的即时是一个副本,而旧的即时被删除了,我该如何解决这个问题以提高效率?
谢谢
复制构造函数在初始化现有对象时使用,例如:
vClass oldInstant;
yClass newInstant = oldInstant; // invoking copy constructor
赋值操作符用于将某个对象赋值给另一个对象,比如一个已存在的对象。
myClass newInstant; // invoking myClss constructor. so from now and on newInstant is already existing object;
newInstant = oldInstant; //oldInstant is also an already existing object. now assign one object to another. (assigning oldInstant to newInstant)
请记住,它们的用法是完全不同的,但每个都有自己的用法。***有时我们想要创建一个对象并给它赋值另一个现有的(复制构造函数),因为我们可能想要保存原始对象并在副本上做一些事情。
***赋值操作符,我们不能避免使用它!!你能在没有运算符"="的情况下做数学计算吗?
复制构造函数和赋值操作符应该做的事情:
***复制构造函数应该使用"深拷贝"而不是"浅拷贝"堆上的内存(用'new'关键字分配的指针)
这只是一些解释,但是你应该在问之前搜索更多,因为成员会投票反对你。
从技术上讲,复制构造函数在以下情况下被调用:
- 显式复制构造
- 按值调用
- 返回值
赋值操作符的实现是用新内容删除现有实例的旧内容。当你展示一个例子:
myClass newInstant;
newInstant = oldInstant;//assignment operator
请记住它们的工作方式不同。拷贝交换涉及赋值操作符。
关于你的最后一个问题,现代编译器应用复制构造函数省略来省略不必要的复制构造函数调用。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- When是私有构造函数而不是私有构造函数
- When是c++中调用的复制构造函数,当我将一个对象赋值给另一个对象时,它不是被调用的吗?
- (c++)赋值操作符与复制构造函数:when都隐式使用
- When是在创建类对象的向量时调用的构造函数