给出以下代码:
#include <iostream>
#include <string>
using namespace std;
class A
{
private:
string m_name;
string m_first;
public:
A(): m_first("string") {}
virtual void print() const {}
string& getName() const {return m_first;} // won't compile
const string& getLastName() const {return m_name;} // compile
};
int main()
{
A a;
return 0;
}
编译器提示:"invalid initialization of reference of type 'std::string&' from expression of type 'const std::string'"
为什么我不能回来&#34; m_first&#34;来自getName()?我认为函数尾部的常量表示函数不会改变&#39;这个......但是我没有尝试改变它,只是返回一个数据成员。
答案 0 :(得分:15)
因为在const方法中,所有非mutable
成员都是隐式const
。所以,你试图将对非const std::string
(你的返回值)的引用绑定到类型为const std::string
的对象,这是非法的(因为它允许修改const数据),因此错误。
答案 1 :(得分:6)
通过返回引用,您说您可以修改引用变量隐式指向的类数据成员,因此修改类...但您已将类方法专用于常量方法,这意味着不允许更改任何未明确声明为可变的类成员变量。因此,通过返回非常量引用,您将破坏类接口已建立的封装“契约”。您可以选择返回临时对象(即创建对象副本)或常量引用。所以你可以做到
const string& getName() const {return m_first;}
或
string getName() const { return m_first; } //copies m_first and returns the copy
答案 2 :(得分:4)
您的代码承诺引用不会更改m_name成员,但您返回可以更改它的引用。你想要的是一个字符串const&amp;返回类型。
这将返回对m_name的“只读”引用。
答案 3 :(得分:2)
当你返回string &
时,它允许修改类成员......但函数是const
,所以不允许这样的情况。但是当你返回const string &
时,它不允许修改类实例。
答案 4 :(得分:1)
如果您致电A.getName().ModifyTheString()
==&gt;该怎么办?这意味着您修改了this
。