谁能向我解释这两个功能之间的区别:
int& test(int a)
{
return a;
}
和
int test(int a)
{
return a;
}
并告诉我在函数的返回类型之后使用“&”运算符的目的是什么?我们什么时候应该使用它,因为我以前很少见过它。
谁能向我解释这两个功能之间的区别?
第一个示例可能会产生未定义的行为,因为返回的引用“指向”一个变量,该变量在函数结束时被销毁。这与悬空指针的定义非常相似(几乎相同)。
第二种情况是在上面指定的示例中返回变量的正常“正确”方式。
并告诉我在函数的返回类型之后使用“&”运算符的目的是什么?
在 return 语句中的类型之后的目的&
是返回对该类型的引用。
我们什么时候应该使用它,因为我以前很少见过它。
通常,传递引用或返回引用有助于避免复制正在传递/返回的参数,这可能代价高昂。
从 C++11 开始,有一种更好的方法来处理返回的大对象:移动语义。
在其他情况下,它用于提供对类的内部成员的访问。这是例如的std::string::operator[]
例子:
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
它也可用于允许函数调用链。这是以下情况:
std::cout << 'H' << 'e' << 'l' << 'l' << 'o';
例如。在上面的代码中,std::ostream::operator<<
返回对自身的引用。
返回类型后的“&”运算符表示该函数返回一个引用。它是有道理的 getter 方法,如
class A{
public:
int &val(){return _val;}
private:
int _val;
};
优点是您可以读取和修改对象的状态。例如:
A a;
a.val() = 10;
但在您的情况下,最好传递对函数的引用而不是返回它:
void test(int &a)
{
//do something with a
}
返回对函数本地对象的引用是不好的,例如:
int& test()
{
int x;
return x;
}
因为x
在 test() 函数之外不存在。
第一个是危险的,因为变量范围。如果你想这样做,你应该使变量静态。