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