Автор Mr.x xxx задал вопрос в разделе Другие языки и технологии
как в С++ В ООП перегрузить с помощью дружественных функций && и ||? и получил лучший ответ
Ответ от ?????? Зелёный змий ??????[гуру]
Так же как и все остальные.
class foo
{
friend foo operator &&(const foo& a, const foo& b);
friend foo operator ||(const foo& a, const foo& b);
};
foo operator &&(const foo& a, const foo& b)
{
foo r;
// TODO
return r;
}
foo operator ||(const foo& a, const foo& b)
{
foo r;
// TODO
return r;
}
Ответ от Glueon glueon[гуру]
Юрий Павлович абсолютно прав. Вопрос стоял как как перегрузить операторы.
не перегруженный оператор выглядит так
bool operator &&(bool a, bool b);
bool заменили на foo, получили перегруженный оператор. Все достаточно тривиально.
А вот зачем это нужно, где и как будет использоваться перегруженный оператор, какой тип оператор должен возвращать - об это ни слова, и осталось где то за кадром, скорее всего в башке какого то "умного" препода.
А то что перегружать операторы && И || не рекомендуется, с этим совершенно согласен. И очень трудно придумать задачу (реальную, а не какую то преподавательскую фикцию) , в которой может возникнуть потребность перегружать логические операторы. В классе Юрия Павловича проще определить operator bool() для логичеческих операторов, не перегружая самих логических операторов.
Юрий Павлович абсолютно прав. Вопрос стоял как как перегрузить операторы.
не перегруженный оператор выглядит так
bool operator &&(bool a, bool b);
bool заменили на foo, получили перегруженный оператор. Все достаточно тривиально.
А вот зачем это нужно, где и как будет использоваться перегруженный оператор, какой тип оператор должен возвращать - об это ни слова, и осталось где то за кадром, скорее всего в башке какого то "умного" препода.
А то что перегружать операторы && И || не рекомендуется, с этим совершенно согласен. И очень трудно придумать задачу (реальную, а не какую то преподавательскую фикцию) , в которой может возникнуть потребность перегружать логические операторы. В классе Юрия Павловича проще определить operator bool() для логичеческих операторов, не перегружая самих логических операторов.
Ответ от Daniel Gulchuck[активный]
Насколько я помню, логические операторы не перегружаемы в цпп.
Насколько я помню, логические операторы не перегружаемы в цпп.
Ответ от Excelsior[гуру]
Оба ответа выше НЕПРАВИЛЬНЫ. Первый неправилен потому, что операторы && и || должны возвращать булевское значение, а не какой-то там объект типа foo. Второй ответ неправилен потому, что операторы && и ||, в принципе, перегрузить можно.
Правильный ответ такой: операторы && и || перегрузить МОЖНО, но делать это КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. Сам по себе перегрузочный код несложен, например, такой, как у Юрия Павловича, с той только разницей, что операторы должны возвращать bool, а не foo. Но не всё, что в С++ сделать МОЖНО, является хорошей идеей. Эта - плохая. Стандартные операторы && и || в С++ снабжены семантикой сокращенного вычисления. А именно, если вычисление левого аргумента у оператора && даёт false, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет false. Точно так же, если вычисление левого аргумента у оператора || даёт true, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет true. Cохранить эту семантику при перегрузке операторов && и || НЕВОЗМОЖНО: при применении перегруженных операторов всегда будут вычисляться ОБА аргумента. Поэтому известный C++ FAQ Маршалла Клайна настоятельно не рекомендует перегружать операторы && и ||.
Оба ответа выше НЕПРАВИЛЬНЫ. Первый неправилен потому, что операторы && и || должны возвращать булевское значение, а не какой-то там объект типа foo. Второй ответ неправилен потому, что операторы && и ||, в принципе, перегрузить можно.
Правильный ответ такой: операторы && и || перегрузить МОЖНО, но делать это КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. Сам по себе перегрузочный код несложен, например, такой, как у Юрия Павловича, с той только разницей, что операторы должны возвращать bool, а не foo. Но не всё, что в С++ сделать МОЖНО, является хорошей идеей. Эта - плохая. Стандартные операторы && и || в С++ снабжены семантикой сокращенного вычисления. А именно, если вычисление левого аргумента у оператора && даёт false, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет false. Точно так же, если вычисление левого аргумента у оператора || даёт true, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет true. Cохранить эту семантику при перегрузке операторов && и || НЕВОЗМОЖНО: при применении перегруженных операторов всегда будут вычисляться ОБА аргумента. Поэтому известный C++ FAQ Маршалла Клайна настоятельно не рекомендует перегружать операторы && и ||.
Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: как в С++ В ООП перегрузить с помощью дружественных функций && и ||?