之间有什么区别
教科书中写了什么:
MyClass& Myclass::operator++() {
do something
return *this;
}
和
MyClass Myclass::operator++() {
do something
return *this;
}
*
表示“指向的价值”....
第二个例子是否会返回此指向的对象的副本(* this的副本),而第一个例子将返回* this本身?
如果是这种情况那么它会有什么不同?改善执行时间?
答案 0 :(得分:1)
两者之间的区别在于
案例1
你正在返回一个引用,即你正在返回一个指向该对象的常量指针。
案例2
您正在创建一个新对象并返回该对象
让我们更深入地了解更好的事情
案例1
因为您返回指向现有对象的指针,所以您所做的任何更改都会影响原始对象
案例2
因为它的副本对原始对象没有影响
在速度和记忆方面
如果是1
因为你返回现有对象的地址没有或只有很少的开销
案例2
您正在创建一个新副本...因此将调用该对象的构造函数,因此在内存和时间方面存在开销
答案 1 :(得分:0)
第二个版本将复制MyClass
对象(即*this
)。第一个将仅返回对它的引用。
并非任何一个都是“正确的” - 它们具有不同的含义。有时您希望克隆一个对象,以便您有两个(可能)独立副本。有时你想共享一个对象。
答案 2 :(得分:0)
正如你在答案中已经提到的那样,第一个返回一个引用,第二个返回一个引用。主要区别在于语义完全不同,请考虑:
const auto & r = ++a;
++a;
assert(a == r); // true/false depending on what is returned
在前缀operator++
的特定情况下,正确的语义(大多数用户期望的语义)正在产生一个引用。做任何其他事情都会引起混淆,最终可能成为源代码中的错误来源。
在一个更一般的问题中,如果函数没有预定义的预期语义,则使用时差异仍然相同。如果你复制(对于那些副本可能很昂贵的那些类型)将是一个更高的成本,但如果你需要引用语义,你将需要产生一个引用,如果你需要复制语义,你将需要返回值no这是多么便宜/昂贵。
请注意,就成本而言,可能会低于您的预期,具体取决于您实际在做什么。如果调用者将使用return来初始化一个新对象,那么成本可能与RVO将启动并删除不必要的额外副本相同。