为什么要返回字符串&从const方法不会编译?

时间:2011-08-29 13:24:37

标签: c++ string reference const

给出以下代码:

#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;这个......但是我没有尝试改变它,只是返回一个数据成员。

5 个答案:

答案 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的“只读”引用。

另请参阅:the C++ FAQ on const correctness

答案 3 :(得分:2)

当你返回string &时,它允许修改类成员......但函数是const,所以不允许这样的情况。但是当你返回const string &时,它不允许修改类实例。

答案 4 :(得分:1)

如果您致电A.getName().ModifyTheString() ==&gt;该怎么办?这意味着您修改了this