(c++)赋值操作符与复制构造函数:when都隐式使用

(C++) assignment operator vs copy constructor: when is each used implicitly

本文关键字:when 构造函数 c++ 赋值操作符 复制      更新时间:2023-10-16

如果我错了,请纠正我,但我的理解是,当你这样做时使用复制构造函数:

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'关键字分配的指针)

这只是一些解释,但是你应该在问之前搜索更多,因为成员会投票反对你。

从技术上讲,复制构造函数在以下情况下被调用:

  1. 显式复制构造
  2. 按值调用
  3. 返回值

赋值操作符的实现是用新内容删除现有实例的旧内容。当你展示一个例子:

myClass newInstant;
newInstant = oldInstant;//assignment operator

请记住它们的工作方式不同。拷贝交换涉及赋值操作符。

关于你的最后一个问题,现代编译器应用复制构造函数省略来省略不必要的复制构造函数调用。