(C ++)赋值运算符与复制构造函数:隐式使用的时间

时间:2016-09-13 22:35:33

标签: c++ copy-constructor assignment-operator

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

myClass newInstant = oldInstant;

当您执行此操作时使用赋值运算符:

myClass newInstant;
newInstant = oldInstant;

我相信两者都会达到相同的结果,但第一个更直接,因为它首先避免使用构造函数然后复制新数据。

我不确定的是,当函数通过引用而不是通过引用传递时,它是使用复制构造函数还是使用赋值运算符复制的。此外,从函数返回瞬间时使用。

通常,在哪些情况下使用了复制构造函数和赋值运算符?

最后一个问题,如何在不复制的情况下返回值?如果返回的瞬间是副本并且旧的瞬间被删除,我将如何解决这个问题以提高效率?

由于

2 个答案:

答案 0 :(得分:2)

当您初始化现有对象时,使用

复制构造函数,如示例所示:

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 :(得分:0)

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

  1. 显式复制构造
  2. 按值调用
  3. 按值返回
  4. 实现赋值运算符以使用新内容删除现有实例的旧内容。当你展示一个例子时:

    myClass newInstant;
    newInstant = oldInstant;//assignment operator
    

    请记住,它们的工作方式不同。复制交换涉及赋值运算符。

    关于你的上一个问题,现代编译器应用复制构造函数elision来消除不必要的复制构造函数调用。