Другие языки программирования и технологии

как в С++ В ООП перегрузить с помощью дружественных функций && и ||?

Так же как и все остальные.

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;
}
Александр Руди
Александр Руди
21 360
Лучший ответ
Оба ответа выше НЕПРАВИЛЬНЫ. Первый неправилен потому, что операторы && и || должны возвращать булевское значение, а не какой-то там объект типа foo. Второй ответ неправилен потому, что операторы && и ||, в принципе, перегрузить можно.

Правильный ответ такой: операторы && и || перегрузить МОЖНО, но делать это КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. Сам по себе перегрузочный код несложен, например, такой, как у Юрия Павловича, с той только разницей, что операторы должны возвращать bool, а не foo. Но не всё, что в С++ сделать МОЖНО, является хорошей идеей. Эта - плохая. Стандартные операторы && и || в С++ снабжены семантикой сокращенного вычисления. А именно, если вычисление левого аргумента у оператора && даёт false, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет false. Точно так же, если вычисление левого аргумента у оператора || даёт true, то правый аргумент вообще не вычисляется, потому что общий результат все равно будет true. Cохранить эту семантику при перегрузке операторов && и || НЕВОЗМОЖНО: при применении перегруженных операторов всегда будут вычисляться ОБА аргумента. Поэтому известный C++ FAQ Маршалла Клайна настоятельно не рекомендует перегружать операторы && и ||.
Максим Макаров
Максим Макаров
43 607
Юрий Павлович абсолютно прав. Вопрос стоял как как перегрузить операторы.
не перегруженный оператор выглядит так
bool operator &&(bool a, bool b);
bool заменили на foo, получили перегруженный оператор. Все достаточно тривиально.

А вот зачем это нужно, где и как будет использоваться перегруженный оператор, какой тип оператор должен возвращать - об это ни слова, и осталось где то за кадром, скорее всего в башке какого то "умного" препода.

А то что перегружать операторы && И || не рекомендуется, с этим совершенно согласен. И очень трудно придумать задачу (реальную, а не какую то преподавательскую фикцию) , в которой может возникнуть потребность перегружать логические операторы. В классе Юрия Павловича проще определить operator bool() для логичеческих операторов, не перегружая самих логических операторов.
Насколько я помню, логические операторы не перегружаемы в цпп.