2015-06-10 3 views
3

У меня есть этот конкретный образец кода:Почему этот метод называется вместо другого?

struct ComplexNumber { 
     float _Re, _Im; 
    public: 
     float Re() const { return _Re; } 
     float& Re()  { return _Re; } 

     float Im() const { return _Im; } 
     float& Im()  { return _Im; } 
    }; 

, и я хотел бы знать, почему, когда я выполняю

ComplexNumber Num1; 
cout << Num1.Re() << endl; 

метод float& Re() { return _Re; } который вызывается, вместо

float Re() const { return _Re; } который, кажется, быть хорошо подготовленным для выполнения cout путем обеспечения данных с помощью const.

+0

Право, спасибо – threaz

+4

Я почти уверен [этот вопрос] (https://stackoverflow.com/questions/21469135/overload-resolution-c-for-const-member-functions) и его [выбранный ответ] (http://stackoverflow.com/a/21469596/1322972) описывают, что вы видите. – WhozCraig

ответ

3

Вызывается лучшая функция соответствия, поэтому, если у вас есть версия const и non const, версия non const будет вызываться на объекте non const.

Если у вас есть константный объект (или указатель или ссылку)

const ComplexNumber Num1; 
cout << Num1.Re() << endl; 

тогда float Re() const { return _Re; } будет называться.

+0

Я могу удалить 'float & Re() {return _Re; } 'и сделайте это снова - метод const будет называться – threaz

+0

@threaz: Потому что это единственная функция, которую можно вызвать. Не так ли? – deepmax

+0

@threaz Вы правы, я этого не знал. Предполагается, что тогда будет вызвана лучшая соответствующая функция. На самом деле, подумайте об этом, я знал это, так как я их использую :) Я знал, что если бы у вас была версия для const, ее вызывал только объект const (или указатель или ссылка). – rozina

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