重载操作符谜题:return * this还是临时变量?

时间:2012-10-20 06:05:28

标签: c++

如果我重载+运算符,我可以使用它(假设类是className)

 className operator+(className & c) { // version 1
    className T;
    ...
    return T;
}

我也可以使用

className operator+(className & c) {   // version 2
    ....
    return *this;
}

这是我的问题:

  1. 在版本2中,我返回引用或就是这样?为什么呢?

  2. 版本1和版本2,哪个更好?

  3. 我们经常写overloading =,<<通过引用返回,使用chain = /<< ,但为什么没有参考我们不能使用chain = /<&lt ;,什么是复制品真的意思?

  4. 另一个问题是,我在有效的c ++中看到:“尽可能使用const”和“更喜欢使用pass by reference”,这是否意味着我尽可能多地编写类函数声明使用const和reference?

  5. 如果我这样写:

    template<typename T> 
    void Print(const T data[], const int & arraySize)  // i use the const, and &
    { 
       for(inti = 0; i < arraySize; ++i) 
       cout << data[i] << " "; 
       cout << endl; 
    }
    

    当我在main()函数中写入时,我写道:

    int iArray[14] = {7,3,32,2,55,34,6,13,29,22,11,9,1,5}; 
    int numInts = 14;    // do I need to specify numInts is const?? 
    

    打印(iArray,numInts);

1 个答案:

答案 0 :(得分:1)

  

在版本2中,我返回引用或就是这样?为什么呢?

没关系,这是错的。

  

版本1和版本2,哪一个更好?

版本1.第二个修改了this对象,因此编写x + y会修改x,这没有用。

  

我们经常写overloading =,&lt;&lt;通过引用返回,使用chain = /&lt;&lt; ,但为什么没有引用我们不能使用chain = /&lt;&lt ;,什么是复制品真正的意思?

没有引用,你只是返回一个副本 - 一个临时 - 所以链接在那些情况下没有意义。编写一个链式=会将调用应用于另一个对象,而不是调用=的对象。

  

另一个问题是,我在&lt;&gt;:“尽可能使用const”和“更喜欢使用引用传递”,这是否意味着我尽可能多地编写类函数声明使用const和引用? / p>

不是真的。在有意义的时候使用它们。例如,operator +const是有意义的,因为您不应修改参数。这也会给版本2带来编译错误(这很好)。

至于引用传递 - 对于大型对象 - 对于intfloat - 如果你没有在里面修改它,则应该首选它。