首页 > 解决方案 > 在 cpp 中的一元运算符重载中,如何确定我们需要在对象的哪一侧放置运算符符号?

问题描述

定义函数->

        car operator *()
        {
            car temp;
            temp.a = a*3;
            temp.b = b*3;
            return temp;
        }

在下面给出的代码中,如何确定 * 是在 o2 之前还是在 o2 之后。

car o3=*o2  //o2 is also an object of same class and has some values for a and b

标签: c++operator-overloadingoverloadingunary-operator

解决方案


只有一个一元运算符可以出现在对象的任一侧。它通过提供两个重载来消除歧义:一个只接受一个参数,另一个接受一个int作为第二个参数。编译器知道这一点,并适当地调用它:

struct S {
    S& operator++();    // pre-increment
    S operator++(int);  // post-increment
};

S s;
++s; // calls S::operator++()
s++; // calls S::operator++(int)

是的,那个额外的论点是一种技巧。不,你不能用它的价值做任何有意义的事情。

所有其他可以重载的一元运算符都出现在与非重载版本相同的位置。如果运算符位于非重载上下文中的对象前面(例如,*ptr),那么它位于重载上下文中的对象前面(例如,*my_object)。如果它来了,它就会来。


推荐阅读