2016-10-11 4 views
6

У меня вопрос, что значит вернуть выражение присваивания, как в моем примере кода? У меня есть перечисление, и я переопределяю оператор ++:. Поэтому в моем коротком примере можно переключаться между лигами, но в коде я не понимаю. Код компилируется и работает нормально.Что означает оператор присваивания в операторах return, например return t = ...?

Код:

enum Traficlight 
{green, yellow, red }; 

Traficlight& operator++(Traficlight& t) 
{ 
    switch (t) 
    { 
    case green: return t = Traficlight::yellow; //Here <-- 
    case yellow: return t = Traficlight::red; //Here <-- 
    case red: return t = Traficlight::green; //Here <-- 
    default: 
     break; 
    } 
} 

int main() 
{ 


    Traficlight Trafic = Traficlight::green; 
    Trafic++; 

    if (Trafic == Traficlight::yellow) 
    { 
     cout << "Light is Yellow" << endl; 
    } 

    string in; 

    cin >> in; 

} 

Что означает "возвращение т = Traficlight :: желтый" означают, почему не могу я просто вернуть "Traficlight :: желтый".

+0

Дополнительную информацию о возвращаемом значении оператора присваивания см. Здесь: http://stackoverflow.com/questions/14697643/low-level-details-of-cc-assignment-operator-implementation-what-does- it-retu –

+3

Это то же самое, что и 't = x; return x; '. – 0x499602D2

+1

Этот код не компилируется: вы определяете preincrement 'operator ++', но используете postincrement 'operator ++'. – aschepler

ответ

5

В инструкциях по возврату оператор присваивает t, который является ссылкой (изменяет его), а затем возвращает значение.

Это то, что делает оператор инкрементации: изменяет &, возвращая ссылку в то же время, чтобы увеличивающееся значение могло использоваться в другой операции.

0

Он присваивает значение переменной t (и в вашем коде t является ссылочным типом, поэтому изменение видно снаружи), а затем возвращаемое значение переменной t.

3

t = Traficlight::yellow пишет Traficlight::yellow в t. Результат этого выражения также Traficlight::yellow, так что это:

return t = Traficlight::yellow; 

равна:

t = Traficlight::yellow; 
return t; 

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

2

Ваша функция принимает аргумент по ссылке:

Traficlight& operator++(Traficlight& t) 

И это оператор ++, так что семантически он должен увеличивать это операнд, а затем возвращать ссылку на этот операнд. Итак, вы должны сделать два действия:

// Assign new value to the t 
t = Traficlight::yellow; 
// Return rusult 
return t; 

Это может быть записано в одной строке, потому что оператор присваивания возвращает назначенное значение.

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