【问题标题】:overloading operator puzzle: return *this, or temporary variable?重载运算符之谜:返回 *this 还是临时变量?
【发布时间】:2012-10-10 17:56:14
【问题描述】:

如果我重载 + 运算符,我可以使用 this(假设类是 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. 我们经常写重载=,

  4. 另一个问题是,我在有效的 c++ 中看到:“尽可能使用 const”和“首选使用传递引用”,这是否意味着我编写类函数声明时尽可能使用 const 和引用?

如果我这样写:

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);

【问题讨论】:

    标签: c++


    【解决方案1】:

    在版本 2 中,我返回参考还是就这样?为什么?

    没关系,错了。

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

    版本1。第二个修改this对象,所以写x + y会修改x,这没有意义。

    我们经常写重载=,

    没有引用,您只是返回一个副本 - 一个临时文件 - 因此在这些情况下链接没有意义。编写链式 = 会将调用应用到不同的对象,而不是调用 = 的对象。

    另一个问题是,我在中看到:“use const as possible”和“prefer use pass by reference”,是不是说我写的类函数声明尽量使用const和引用?

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

    至于通过引用传递 - 它应该是大型对象的首选 - 对于 intfloat - 如果您没有在内部修改它,则按值传递。

    【讨论】:

    • 为什么我的版本 2 是错误的?我认为是对的。我修改了 *this,比如 x += c.x,然后返回 *this,what's wearg?
    • @user1760040 in x += c.x,您希望 x 被修改。修改this为简单的+,意思是如果你做z = x + yx会被修改。这就是你想要的吗?
    • @user1760040 你的问题不是关于+=,而是关于+,两个完全不同的运营商。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多