需要帮助理解返回引用的函数
Need help understanding functions that returns a reference
课本内容:
MyClass& Myclass::operator++() {
do something
return *this;
}
和
MyClass Myclass::operator++() {
do something
return *this;
}
*
表示"指向"的值....
是否第二个示例将返回this指向的对象的副本(*this的副本),而第一个示例将返回*this本身?
如果是这样,那又有什么区别呢?提高执行时间?
两者的区别在于
in case 1
你返回的是一个引用,也就是说你返回的是一个指向该对象的常量指针。
In case 2
你正在创建一个新对象并返回对象
让我们更深入地了解事情
In case 1
由于返回的是指向现有对象的指针,因此对
所做的任何更改都会影响原始对象
In case 2
因为它是一个副本,所以对原始对象没有影响
在速度和内存方面
如果是1
由于您返回的是一个现有对象的地址,因此没有或很少有开销
In case 2
你正在创建一个新的副本…因此,对象的构造函数将被调用,因此在内存和时间方面存在开销
第二个版本将复制MyClass
对象(即*this
)。第一个函数只返回对它的引用。
并不是其中任何一个都是"正确的",而是它们有不同的含义。有时您希望克隆一个对象,以便拥有两个(可能)独立的副本。有时候你想共享一个对象
正如您在答案中已经提到的那样,第一个返回引用,第二个正在生成副本。主要的区别是语义完全不同,考虑:
const auto & r = ++a;
++a;
assert(a == r); // true/false depending on what is returned
在前缀operator++
的特殊情况下,正确的语义(大多数用户期望的语义)产生一个引用。做任何其他事情都会引起混乱,并可能最终成为源代码中bug的来源。
在一个更一般的问题中,如果函数没有预定义的预期语义,那么在用法方面的差异仍然是相同的。如果复制(对于那些拷贝可能是昂贵的类型),则成本更高,但如果需要引用语义,则需要生成引用,如果需要复制语义,则需要按值返回,无论这是多么便宜/昂贵。
注意,关于成本,它可能比您期望的要少,这取决于您实际在做什么。如果调用者要使用return来初始化一个新对象,成本可能与RVO将启动并删除不必要的额外副本相同。
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么