在C++中将值作为常量,引用和常量引用返回的含义是什么?

use*_*815 13 c++ return-value

我正在学习C++,我仍然对此感到困惑.在C++中将值作为常量,引用和常量引用返回有什么含义?例如:

const int exampleOne();
int& exampleTwo();
const int& exampleThree();
Run Code Online (Sandbox Code Playgroud)

Pla*_*mer 27

这是你所有案件的缩减:

•按引用返回:函数调用可用作赋值的左侧.例如,使用运算符重载,如果你有operator []重载,你可以这样说

a[i] = 7;
Run Code Online (Sandbox Code Playgroud)

(通过引用返回时,您需要确保返回后返回的对象可用:您不应返回对本地或临时的引用)

•返回为常量值:禁止在赋值表达式的左侧使用该函数.考虑重载运算符+.人们可以这样写:

a + b = c; // This isn't right
Run Code Online (Sandbox Code Playgroud)

将operator +的返回类型设置为"const SomeType"允许按值返回,同时防止表达式在赋值的左侧使用.

以常数值返回也可以防止这样的拼写错误:

if (someFunction() = 2)
Run Code Online (Sandbox Code Playgroud)

当你的意思

if (someFunction() == 2)
Run Code Online (Sandbox Code Playgroud)

如果someFunction()声明为

const int someFunction()
Run Code Online (Sandbox Code Playgroud)

然后上面的if()拼写错误将由编译器捕获.

•作为常量引用返回:此函数调用不能出现在赋值的左侧,并且您希望避免复制(按值返回).例如,假设我们有一个班级学生,我们想提供一个访问者ID()来获取学生的ID:

class Student
{
    std::string id_;

public:

    const std::string& id() const;
};

const std::string& Student::id()
{
    return id_;
}
Run Code Online (Sandbox Code Playgroud)

考虑id()访问器.这应该声明为const以保证id()成员函数不会修改对象的状态.现在,考虑返回类型.如果返回类型是字符串,则可以编写如下内容:

Student s;
s.id() = "newId";
Run Code Online (Sandbox Code Playgroud)

这不是我们想要的.

我们可以通过值返回,但在这种情况下,通过引用返回更有效.使返回类型成为const字符串并另外防止修改id.

  • 示例:您的Student :: id()示例是安全的,因为_id引用了一个长期存在的成员变量,但是下面类似的代码将导致未定义的行为(崩溃):"const std :: string&Student :: id (){return id_ +"xyz";}" (3认同)
  • 是的,通过引用返回临时或本地是绝对错误的.我试图通过一个合适的例子突出显示*返回*值与通过引用返回之间的区别,而不是说明一个用法何时适合另一个用法.为了完整起见,我更新了我的答案. (3认同)

Joe*_*der 6

要理解的基本事项是按值返回将创建对象的新副本.通过引用返回将返回对现有对象的引用.注意:就像指针一样,你可以有悬空参考.因此,不要在函数中创建一个对象并返回对该对象的引用 - 它将在函数返回时被销毁,并且它将返回一个悬空引用.

按价值返回:

  • 当你有POD(普通旧数据)
  • 当您想要返回对象的副本时

以参考方式返回:

  • 如果您有性能原因要避免返回的对象的副本,并且您了解对象的生命周期
  • 必须返回对象的特定实例时,才能理解对象的生命周期

Const/Constant引用可帮助您强制执行代码的合同,并帮助用户的编译器查找使用错误.它们不会影响性能.