c – 两种形式的返回物体有什么区别?

我正在尝试为创建的Integer类重载二进制文件

const Integer operator+(const Integer& left,const Integer& right) 
{
    return Integer(left.i + right.i);
}

const Integer operator+(const Integer& left,const Integer& right)
 {
     Integer tmp(left.i + right.i);
     return tmp;
 }

现在我学到的是,在第一种情况下,创建一个临时的Integer对象并返回,在第二种情况下,使用构造函数调用然后复制然后调用析构函数来创建通常的对象. Ecekl对第一个问题所说的是编译器通过将对象直接构建到外部返回值的位置来利用这一点.我们从中推断出什么?我读到了返回值优化,但无法通过直接复制到位置事物来获得它的含义.

解决方法

绝对没有区别,在大多数情况下,一个体面的编译器会将第二种形式优化为第一种形式 – 并且在返回tmp时将执行复制/移动省略 Named Return Value Optimization (NRVO).

如果它使代码对您更具可读性,或者更易于维护和/或调试,则可能需要使用第二种形式.如果您关注性能,则没有理由(除非您关闭了编译器优化,但这表明您首先对性能不感兴趣).

但是请注意,返回const Integer并没有多大意义.由于您按值返回,因此您应该返回一个Integer:

Integer operator + (const Integer& left,const Integer& right) 
{
    return Integer(left.i + right.i);
}

作为最后的评论,如果Integer有一个非显式的构造函数接受一个int(注意,通常不是这种情况,因为接受一个参数的构造函数通常被标记为显式以避免尴尬的隐含,因此甚至可以重写如下)转换):

Integer operator + (const Integer& left,const Integer& right) 
{
    return left.i + right.i;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...