2016-04-28 3 views
1

Недавно я наткнулся на следующую часть кода. Я не знаю, если это имеет смысл, я просто пытаюсь понять:std :: cin непосредственно к функции

#include <iostream> 
class foo{ 
    private: 
     int memeber; 
    public: 
     int &method(){ return memeber; } 
}; 

int main(){ 
    foo bar; 
    std::cin >> bar.method(); 
} 

Я никогда не видел подобного раньше. Я удивлен, что он даже компилируется. Как вы можете напрямую подключиться к адресу функции? Может ли кто-нибудь уточнить, что он делает и может ли он быть использован для чего-либо?

+2

'bar.method()' не является адресом функции, а ссылкой, возвращаемой функцией. – MikeCAT

+0

О, так это значит, что std :: cin собирается писать непосредственно частному члену этого класса? Это хорошая или плохая практика? –

+1

@ user3125731 Это, вероятно, более плохая практика, позволяющая получить прямой доступ к любым частным членам класса. Но, возможно, могут быть допустимые варианты использования. –

ответ

5

Этот код:

std::cin >> bar.method(); 

может быть переписан более многословен:

int &ref = bar.method(); 
std::cin >> ref; 

так результат вызова method() который является ссылкой на int передается std::cin.operator>>()

4

Может кто-то уточнить о том, что он делает и может ли он использоваться для чего-либо?

bar.method() возвращает ссылку на foo::memeber, которая может использоваться как значение lvalue.

Как вы можете напрямую подключиться к адресу функции?

Это не адрес функции.

int &method(){ return memeber; } 
//^

Как @Lightness mentioned это немного сбивает с толку. Лучше (ясно) стиль, чтобы написать, что, вероятно,

int& method(){ return memeber; } 
//^makes it more clear that it's a int reference and not address of the function 

-значение может быть использовано с std::istream& operator>>(std::istream&,T&) оператора, как и любого другими именующим (то есть переменный).

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