Maj*_*jak 40 c++ reference const-reference return-by-reference return-by-value
你能解释一下返回值,引用值和const引用值之间的区别吗?
值:
Vector2D operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
非const引用:
Vector2D& operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
Const参考:
const Vector2D& operator += (const Vector2D& vector)
{
this->x += vector.x;
this->y += vector.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
这有什么好处?我理解const引用传递给函数背后的意义,因为你要确保不要修改引用指向函数内部的这个值.但我对返回const引用的含义感到困惑.为什么返回引用比返回值更好,为什么返回const引用要比返回非const引用更好?
Mik*_*our 22
除非你写一些奇怪的东西,否则没有区别
(v1 += v2) = v3;
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,赋值将是临时的,整体效果将是v1 += v2.
在第二种情况下,赋值将是v1,因此整体效果将是v1 = v3.
在第三种情况下,不允许转让.这可能是最好的选择,因为这种怪异几乎肯定是一个错误.
为什么返回引用比返回值更好?
它可能更有效:您不必复制该对象.
为什么返回const引用比返回非const引用更好?
你可以像上面的例子一样防止怪异,同时仍然允许更少的奇怪链接
v1 = (v2 += v3);
Run Code Online (Sandbox Code Playgroud)
但是,正如评论中所指出的,这意味着您的类型不支持与内置类型相同的(ab)使用形式,这是某些人认为合适的.
Tom*_*mek 11
值:
按值返回意味着您将返回对象的副本.这就要求对类(它必须是可复制的或可移动的)的要求.这意味着对于按值返回的某些类的对象可能是昂贵的(在RVO或NRVO不起作用或关闭的情况下).这也意味着新对象与其他对象是独立的(取决于其设计),并且是它自己的值.这可能是你应该从许多二元运算符返回的,如+, - ,*等.
非const引用:
你真的为另一个对象返回别名.别名为非const允许您修改别名对象.这是你应该从一些一元的操作符返回的内容,比如前缀++和 - ,以及*(取消引用),因为你通常希望能够修改返回的对象.
这由运算符>>和运算符<<为流重载而返回.这允许运营商链接:
cout << 5 << "is greater then" << 1 << endl;
cin >> myInt >> myFloat;
Run Code Online (Sandbox Code Playgroud)
当你想允许链接这样的常规方法时,你也可以返回*this的引用:
object.run().printLastRunStatistics();
Run Code Online (Sandbox Code Playgroud)
Const参考:
像上面一样但你不能修改别名对象.当要返回的对象复制起来很昂贵以及从函数返回后可以确保它存在时,可以使用而不是按值返回.
这就是operator =通常以标准类型支持它们的方式返回以允许多个赋值:
a = b = c;
Run Code Online (Sandbox Code Playgroud)
operator =中使用的const-reference阻止了这种用法(据我记忆,标准类型不支持):
++(a = b);
Run Code Online (Sandbox Code Playgroud)
如果使用正常参考,则允许使用.
它与向函数传递参数完全相同.
您希望在返回const对象的属性时返回引用,并且不希望在其外部进行修改.例如:当您的对象具有名称时,您可以使用以下方法const std::string& get_name(){ return name; };.哪种方式最佳.您允许对内部属性进行"只读"访问,而不进行复制.
当你重载操作符时,你应该返回一个可变的对象,否则一些通常可以使用的某些语法会产生错误.当你尝试一些奇怪的链接时,这是非常重要的.
例如,选项3不适用于类似的东西(v1 += v2).non_const_method(),而以下将:
v1+=v2;
v1.non_const_method();
Run Code Online (Sandbox Code Playgroud)
之间的差值回报按值和返回按引用需要在运行时间期间的效果:
当您返回对象按值时,将调用copy-constructor,并在堆栈上创建一个临时实例。
当您按引用返回对象时,上述所有操作均不会发生,从而提高了性能。
之间的差额收益按参考,并返回由常数引用没有运行时的效果,简直是为了保护你从编写错误代码。
例如,使用Vector2D& operator += (const Vector2D& vector),您可以执行以下操作:
(x+=y)++或class中的非const函数在(x+=y).func()哪里?funcVector2D
但是使用时const Vector2D& operator += (const Vector2D& vector),编译器将为任何类似的尝试生成错误。