c++ - 如何让运算符从对象的左侧开始工作?

标签 c++

这个问题感觉太基础了,以至于没有人问过,所以如果它已经存在,我会接受链接作为答案,或者如果你们认为合适,我会删除这篇文章,就我个人而言,至少我在任何地方都找不到它所以也许这对其他人有用...

是的,就像标题中所说的那样,我如何制作可以让我从对象的左侧开始工作的运算符? f.e:

++obj
variable * obj

等等

如果我想在那个“obj”的右侧工作,我会做类似的东西

obj operator*(const variable &t){...} //for obj * variable operation

凭直觉我试过了

obj *operator(const variable &t){...} //for variable * obj operation(?)

让它以相反的方式工作,当然,那没有用,有什么建议吗?

最佳答案

嗯,你不能那样做。我的意思是,选择运算符(operator)在哪一侧工作。它由标准定义。 C++ 中的运算符没有它们操作的边。都是不同的运营商。您重载的运算符由签名定义。

无论如何,“边”只对一元运算符有意义。对于二元运算符,它要么是在左操作数上调用的成员函数,右操作数作为参数传递,要么是独立函数。

“允许边定义”的情况是++--。而且是特例。 ++cc++ 实际上是两种不同的语言运算符——前递增和后递增。通过重载中的“伪造”参数实现的区别:http://en.cppreference.com/w/cpp/language/operator_incdec .

还有其他一元运算符,您不能选择边 例如:!~,没有为“右边”情况定义合适的重载。

其他消歧也是通过参数完成的。 * 用于成员访问和算术运算。您重载的运算符由参数数量定义。

T T::operator*(const T2 &b) const;是算术,R& T::operator*();是成员访问。

在这里您可以找到所有运算符的规则:http://en.cppreference.com/w/cpp/language/operators .

Aaand 因为它是 c++ 你可以滥用它。不过不推荐。

关于c++ - 如何让运算符从对象的左侧开始工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114429/

相关文章:

c++ - 内联函数编译

c++ - 编写加载 msvcr80.dll 并公开 free() 函数的 DLL

c++ - 函数怎么写才整齐?考虑日志,一次返回,不再缩进?

c++ - 与 Windows(和 Windows Embedded CE)中的 CLOCK_MONOTONIC 类似的功能

c++ - 如何将命名空间中的 C++ 类包含到 Cython 中?

c++ - __attribute__((__packed__)); 之间有什么区别?和#pragma pack(1)

c++ - CMake <PROJECT-NAME>_SOURCE_DIR 变量作用域

c++ - 将字符串变量传递给 boost::ASIO 读取器/处理程序会导致段错误

c++ libcurl无法访问,命令行有效

c++ - 如何禁用 printf 功能?