我正在学习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.
要理解的基本事项是按值返回将创建对象的新副本.通过引用返回将返回对现有对象的引用.注意:就像指针一样,你可以有悬空参考.因此,不要在函数中创建一个对象并返回对该对象的引用 - 它将在函数返回时被销毁,并且它将返回一个悬空引用.
按价值返回:
以参考方式返回:
Const/Constant引用可帮助您强制执行代码的合同,并帮助用户的编译器查找使用错误.它们不会影响性能.