C ++并返回一个引用

时间:2013-10-03 02:27:27

标签: c++ reference

任何人都可以向我解释这两个功能之间的区别:

int& test(int a)
{
    return a;
}

int test(int a)
{
    return a;
}

告诉我使用'&'的目的是什么运算符返回后的函数类型? 我们什么时候应该使用它,因为我以前很少见过它。

3 个答案:

答案 0 :(得分:2)

  

任何人都可以向我解释这两个功能之间的区别吗?

第一个示例可能会产生未定义的行为,因为返回的引用“指向”一个变量,该变量在函数末尾被销毁。这与dangling pointer的定义非常相似(几乎完全相同)。

第二种情况是在上面指定的示例中返回变量的正常“正确”方式。


  

告诉我使用'&'的目的是什么返回函数后的运算符?

return语句中的类型之后&的目的是返回对该类型的引用。


  

我们什么时候应该使用它,因为我以前很少见过它。

通常,传递引用或返回引用有助于避免复制传递/返回的参数,这可能会很昂贵。

从C ++ 11开始,有一种更好的方法来处理返回的大对象:move semantics

在其他情况下,它用于提供对类的内部成员的访问。这是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<<返回对自身的引用。

答案 1 :(得分:0)

'&安培;'返回类型后的运算符意味着该函数返回一个引用。有意义的是像

这样的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()函数之外不存在。

答案 2 :(得分:0)

第一个是危险的,因为范围可变。如果你想这样做,你应该将变量设为静态。