0

我想知道我是否可以写,例如:<<(object, cout);或者<<(cout,object);object 是一个用户定义的类,它有<<运算符重载,就像人们可以写: int a = +(2,3);并获得预期的结果,如int a = 2 + 3;. 此外,如果这是可能的,但需要几个步骤,应该怎么做?是否应该<<使用两种不同的签名使运算符重载?

4

2 回答 2

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<<代替<<

笔记:

这不适用于基本数据类型。当您使用这些运算符的重载版本时,请注意类范围和命名空间。

于 2020-04-05T15:58:06.350 回答
1

你可以这样做,例如

operator<<(std::cout, "hi");

这个表达

int a = +(2, 3);

不是在做operator+。它首先应用,序列运算符,得到3,然后应用一元运算符,+得到 3。

你不能这样做

int a = operator+(2, 3); // error

因为ints 是基本类型。

如果您有用户定义的类型S,则以下代码段具有相同的含义

S s{};
std::cout << s;
auto x = s + s;

是相同的

S s{};
operator<<(std::cout, s);
auto x = operator+(s, s);

假设运算符是为 定义的S,则将调用正确的运算符。

于 2020-04-05T15:58:48.843 回答