Можно ли вызвать оператор << с использованием префиксной записи?
Интересно, могу ли я написать, например: <<(object, cout);
или <<(cout,object);
где объект - это определенный пользователем класс, который имеет <<
оператор перегружен, как можно было бы написать:int a = +(2,3);
и получить ожидаемый результат, как в int a = 2 + 3;
. Кроме того, что делать, если это возможно, но требует нескольких шагов? Если перегрузить<<
оператор с двумя разными подписями?
2 ответа
так же, как можно было бы написать: int a = +(2,3); и получим ожидаемый результат, как в int a = 2 + 3;
Нет, у вас недоразумение. +(2, 3)
будет идти по ассоциативности оператора запятой и назначать+3
(3) к переменной a
.
Следовательно, int a = +(2, 3)
такой же как int a = 3
, и нет int a = 2 + 3
Интересно, могу ли я написать, например: << (object, cout); или << (cout,object);
Нет, не можешь.
Если вы хотите использовать операторы таким образом, вы должны назвать его полное имя, например:
operator+
вместо того +
operator<<
вместо того <<
Примечание:
Это не сработает для основных типов данных. Позаботьтесь об области видимости класса и пространствах имен, когда вы используете перегруженные версии этих операторов.
Вы можете сделать это, например
operator<<(std::cout, "hi");
Это выражение
int a = +(2, 3);
не делает operator+
. Сначала применяется,
оператор последовательности, который дает 3
, а затем применяя унарный +
, что дает 3.
Ты не можешь этого сделать
int a = operator+(2, 3); // error
потому как int
s - фундаментальные типы.
Если у вас есть определенные пользователем типы S
, то следующие фрагменты имеют то же значение
S s{};
std::cout << s;
auto x = s + s;
такой же как
S s{};
operator<<(std::cout, s);
auto x = operator+(s, s);
предполагая, что операторы определены для S
, будет вызван правильный оператор.