C++ 为什么要使用关键字';常数';在一个类成员函数C++;

C++ 为什么要使用关键字';常数';在一个类成员函数C++;,c++,oop,accessor,C++,Oop,Accessor,我一直在类中运行函数定义,这些类如下所示: //Accessor function const string getName() const { return name; } 我的问题是:为什么“const”这个词出现两次。我知道定义末尾的“const”有助于保护原始成员信息,但第一个“const”起什么作用?第一个const将返回值限定为不可修改;第二个const指定函数不修改调用它的类实例(或其任何成员) 当函数返回对成员的引用时,第一个更常用,以防止返回的引用被用于修改它所引用的

我一直在类中运行函数定义,这些类如下所示:

//Accessor function
const string getName() const {
    return name;
}

我的问题是:为什么“const”这个词出现两次。我知道定义末尾的“const”有助于保护原始成员信息,但第一个“const”起什么作用?

第一个
const
将返回值限定为不可修改;第二个
const
指定函数不修改调用它的类实例(或其任何成员)


当函数返回对成员的引用时,第一个更常用,以防止返回的引用被用于修改它所引用的成员。

第一个
常量将返回值限定为不可修改;第二个
const
指定函数不修改调用它的类实例(或其任何成员)


当函数返回对成员的引用时,第一个更常用,以防止返回的引用被用于修改它所引用的成员。

您确定它是
const string
而不是
const string&
?后者有道理,但前者没有道理。它与只返回
字符串
基本相同,只是它强制复制而不是移动字符串(这只会损害性能)。我发布它的方式与书中所写的方式相同。这本书主要是针对入门级程序的,所以如果他们没有使用最有效的技术,我也不会感到惊讶。他们可能只是想把一般的观点讲清楚。请记住一条一般规则,即
const
限定符适用于其最左边的对象,但如果它首先出现,则适用于其最右边的对象。第一个
stringconst
返回的字符串是一个const,但该const对调用者来说无关紧要,因此没有用处。后者
常量
适用于
指针指向的类型。就好像隐含的
this
T const*this
。因为返回值是
string s=foo.getName()
返回的
字符串
常量
@Eljay不重要,这个常量非常重要。除此之外,它还禁止从生成的右值移动!您可能正在考虑,但它说非类类型的PRValue不能有cv限定符。您确定它是
常量字符串
而不是
常量字符串&
?后者有道理,但前者没有道理。它与只返回
字符串
基本相同,只是它强制复制而不是移动字符串(这只会损害性能)。我发布它的方式与书中所写的方式相同。这本书主要是针对入门级程序的,所以如果他们没有使用最有效的技术,我也不会感到惊讶。他们可能只是想把一般的观点讲清楚。请记住一条一般规则,即
const
限定符适用于其最左边的对象,但如果它首先出现,则适用于其最右边的对象。第一个
stringconst
返回的字符串是一个const,但该const对调用者来说无关紧要,因此没有用处。后者
常量
适用于
指针指向的类型。就好像隐含的
this
T const*this
。因为返回值是
string s=foo.getName()
返回的
字符串
常量
@Eljay不重要,这个常量非常重要。除此之外,它还禁止从生成的右值移动!您可能正在考虑,但它说非类类型的prvalues不能有cv限定符。因此,如果函数要向主程序返回对整数成员的引用,则在主程序中保存该值的变量将无法更改该值?(希望我的措辞是正确的)@u红鹰是的。如果您有
string&str=myClass.getName()
(或类似的)在代码中,您可以通过修改返回的
str
引用来修改
名称
成员。将
const
限定符添加到返回的引用中可以防止出现这种情况。因此,在最基本的使用中,如果只需要函数返回人名以便我可以在屏幕上显示它,最好使用第一个const?因此,如果函数要将对整数成员的引用返回到主程序,在主程序中保存此值的变量将无法更改该值?(希望我的措辞是正确的)@u红鹰是的。如果您有
string&str=myClass.getName()
(或类似的)在代码中,您可以通过修改返回的
str
引用来修改
名称
成员。将
const
限定符添加到返回的引用中可以防止出现这种情况。因此,在最基本的使用中,如果只需要函数返回人名以便我可以在屏幕上显示它,最好使用第一个const?