2014-11-13 3 views
-1

К примеру у меня есть функция доступа для класса:Accessor функция в классе C++

class A { 
public: 
int a; 
int& getA() const; 
}; 

int& A::getA() const { 
return a; // error: invalid initialization of reference of type 'int&' from expression of type 'const //     int' 
} 

Вопросов: 1. Элемента данных «а» не типа «сопзИ Int», так почему Ошибка?
2. Также, когда я меняю тип возврата на int, он работает. Зачем?

+0

Вызывающий 'getA' может изменить его, так как он возвращает ссылку на' a', но вы также говорите, что это функция 'const', указывая на то, что * не будет * изменять состояние объекта (что не является верный). Если 'a' является общедоступным, почему даже есть аксессор? – crashmstr

+1

Используйте 'const int & getA() const; ' –

+0

@crashmstr Это просто пример,« а »вполне может быть закрытым. – tinus91

ответ

4

Поскольку вы указываете, что getA() является const. Возврат ссылки на переменную-член, отличную от const, из метода, объявленного как const, позволит изменить указанное значение.

Если вы хотите аксессор только для чтения, то просто объявить аксессор, как

const int& A::getA() const 

в противном случае вы должны удалить константность из метода.

Включение возвращаемого значения в int разрешено, потому что вы больше не возвращаете ссылку, а копию a, так что нет возможности изменить исходную переменную-член.

виду, что вам разрешено иметь их оба доступны:

int& getA() { return a; } 
const int& getA() const { return a; } 
+0

Исправьте меня, если я ошибаюсь здесь, но не «int & A :: getA() const» подразумевает, что функция getA() не может напрямую модифицировать элементы данных, но не ограничивает того, что она не может быть вызвана внутри непостоянную функцию, которая может изменять элементы данных. Кроме того, я знаю, что методы const класса не могут вызывать неконстантные методы. С другой стороны, тоже? – tinus91

+0

@ tinus91 вы можете неявно преобразовывать non const в const, но не наоборот. Таким образом, вы можете вызывать постоянный метод от непостоянного, но не наоборот. – Slava

1

ошибка исходит из того, что функция член обозначенному const. Вы не можете вернуть не- const ссылки в методе const, потому что место вызова может изменить значение:

a.getA() = 2; 

Когда вы возвращаете int копируют, что стоимости и составляет выше производить ошибку компиляции.

0

Давайте посмотрим на этот код:

const int *ptr = ...; 
int &ref = *ptr; // case 1 
int var = *ptr; // case 2 

Будет случай 1 компиляции? Нет, потому что ptr является указателем на константу int и присваивает это неконтактной ссылке разрывает этот контракт. Будет ли «случай 2» скомпилировать? Да, потому что вы «делаете копию», то есть только чтение значения из константы.

Теперь в вашем случае, метод, который вы пишете, эквивалентно следующему:

int& getA() const { return this->a; } 

Вы не должны использовать this явно, но это в любом случае. Выражение const после метода в основном делает this type const A * внутри это способ. Теперь, если вы попытаетесь присвоить (возврат аналогичен назначению) this->a - int &, вы получите «случай 1», если вы попытаетесь присвоить int, вы получите «случай 2», как указано выше.

+0

Большое спасибо за объяснение того, что на самом деле происходит, теперь я понимаю ошибку. – tinus91

0

элемент данных «а» не типа «сопзЬ Int»

Что касается функции constgetA члена обеспокоен, да это.
Все члены, не являющиеся членами mutable, являются const ed с точки зрения функции-члена const. Следовательно, вы пытаетесь связать const int с int&.

Также, когда я меняю тип возврата на int, он работает. Зачем?

Вы можете скопировать const int в int просто отлично.

Смежные вопросы