【问题标题】:C++ and returning a reference [duplicate]C ++并返回引用[重复]
【发布时间】:2013-10-03 02:27:27
【问题描述】:

谁能给我解释一下这两个功能的区别:

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

int test(int a)
{
    return a;
}

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

【问题讨论】:

  • 由于此处显示的确切原因,您通常不希望将其用作返回类型。
  • 它不是“运算符”。只是 & 字符恰好与某些运算符中使用的字符相同。
  • 好的,谢谢大家,我从那个链接得到的最好的东西是:“如果你需要返回一个值,返回一个值,不要担心任何“费用”。无论如何,谢谢为你提供帮助@@
  • 第一种方法旨在返回给定变量的引用。它通常在传递参数时使用。因此,您将引用作为输入传递。第二种方法,只返回变量 A 的值而不是引用。通过值传递变量和通过引用传递变量是有区别的。

标签: c++ reference


【解决方案1】:

谁能给我解释一下这两个函数的区别?

第一个示例可能会产生未定义的行为,因为返回的引用“指向”一个变量,该变量在函数结束时被销毁。这与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&lt;&lt; 返回对自身的引用。

【讨论】:

  • 我不知道确切的解释它应该是什么的方式,因为我的英语不太好,但我想知道当我们在返回类型之后使用 & 时的“目的”是什么。可能是下面的示例没有显示确切的方式,这正是我的想法,对此感到抱歉。我只是想知道我们使用它时的“目的”。谢谢你的评论:D
  • @dinhha471,看看新的编辑。
  • 在我看来,尽管返回对 int 的引用可能是合法的“C”,正如上面有人指出的那样,该函数正在返回对函数堆栈上变量的引用。因此,当您尝试访问它时,您可能会遇到访问冲突或 SEGV。
  • @Jeffrey :当我看到 C/C++ 库中的某些函数时,我想知道这就是什么。但实际上,到目前为止,我从未使用过它。您的解释太好了,我无法为您投票(因为我的声誉不够),谢谢
【解决方案2】:
返回类型后面的

'&'运算符表示函数返回一个引用。像

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

【讨论】:

  • 感谢提到getter和setter,很容易理解
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2017-10-01
    • 2017-08-12
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多