2016-08-20 78 views
3

我最近刷新了我的C++运算符重载知识。按照建议我回复operator overload of '='*this的引用。但后来我发现一个问题: -=一个类的=运算符的重载

#include <iostream> 
using namespace std; 

class MyClass 
{ 
    int num = 4; 
    public: 
     MyClass() = default; 
     MyClass(int x) : num(x) {} 
     void getnum(int x) 
     { 
      num = x; 
     } 
     void shownum() 
     { 
      cout << num << '\n'; 
     } 
     MyClass& operator = (const MyClass& obj) // works even without const 
     { 
      this->num = obj.num; 
      return *this; 
     } 
     ~MyClass() = default; 
}; 

int main() 
{ 
    MyClass x, y(5), z(7); 

    z = MyClass(8) = y; // temporary object return reference 

    x.shownum(); 
    y.shownum(); 
    z.shownum(); 
} 

此代码犯规的结果为,即使临时对象MyClass(8)参与其中之间的UBy(精没问题)相提并论,但随后的引用将被发送等同于z。为什么dangling reference问题在这里没有发生?为什么过载功能在没有const MyClass&' on the temporary object 'MyClass(8)的情况下工作?

+1

这是一种隐式转换。让一个对象更具常量易变性是完全合理的 – Incomputable

+0

为什么你要考虑编写这样的代码 –

+0

实验@EdHeal :-P –

回答

4

临时直播直到完整表达式结束。临时结束时,临时消失,但是到那时,所有的任务都已经完成,并且因为您没有将参考存储在临时消失的任何地方。

+0

@OlzhasZhumabek他们做 –

+0

@Joachim'MyClass(8)'返回一个对自身的引用,但我的问题是当它一被销毁使用isn; t现在发送的引用与'z'无效,因为临时文件已被销毁。 –

+0

@JoachimPileborg,没关系。我得到了我需要的所有答案[gotw](https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/):) – Incomputable

4

第一项作业MyClass(8) = y;返回一个MyClass&,它没有告诉任何关于是临时的。因此它与下一个operator=的参数相匹配,无论该参数是否需要const或非const参数。

如果您尝试只分配一个临时的z = MyClass(8);,您会看到它现在需要该参数为一个常量引用。因为临时对象直到完整表达式的末尾(通常在;),并且没有指针或引用保存在任何地方,所以这里没有悬挂引用。只需复制num值。

+0

好的,回答第二个问题。第一个呢? –

+0

对,一个人的价格有两个问题。 :-) –