Почему возвращаемая строка & из метода const не компилируется? - PullRequest
5 голосов
/ 29 августа 2011

С учетом следующего кода:

#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'" Почему я не могу вернуть "m_first" из getName ()? Я думал, что констант в хвосте функции утверждает, что функция не изменит «это» ... но я не пытаюсь изменить это, просто вернуть элемент данных.

Ответы [ 5 ]

15 голосов
/ 29 августа 2011

Поскольку внутри метода const все не mutable члены неявно const.Таким образом, вы пытаетесь привязать ссылку на неконстантное std::string (возвращаемое значение) к объекту типа const std::string, что недопустимо (поскольку допускает изменение константных данных), поэтому возникает ошибка.

6 голосов
/ 29 августа 2011

Возвращая ссылку, вы говорите, что можете изменить элемент данных класса, на который косвенно указывает ссылочная переменная, и, следовательно, изменить класс ... но вы выделили метод класса как постоянный метод, то естьне разрешается изменять любые переменные-члены класса, которые не были специально объявлены как изменяемые.Таким образом, возвращая непостоянную ссылку, вы нарушаете «контракт» инкапсуляции, установленный интерфейсом класса.Вы можете либо вернуть временный объект (т. Е. Который создает копию объекта), либо постоянную ссылку.Таким образом, вы можете сделать

const string& getName() const {return m_first;}

или

string getName() const { return m_first; } //copies m_first and returns the copy
4 голосов
/ 29 августа 2011

Ваш код обещает, что ссылка не изменит члена m_name, но вы вернете ссылку, которую может изменить.То, что вам нужно, это строка const & return type.

Возвращает ссылку "только для чтения" на m_name.

См. Также: Часто задаваемые вопросы C ++ по правильности const

2 голосов
/ 29 августа 2011

Когда вы возвращаете string &, это позволяет изменить члена класса ... но функция - const, поэтому нельзя допускать такой ситуации. Но когда вы возвращаете const string &, это не позволяет изменять экземпляр класса.

1 голос
/ 29 августа 2011

Что если вы позвоните A.getName().ModifyTheString() ==>, значит, вы изменили this.

...