是否可以在头文件中重载运算符(在声明类时)?

时间:2015-08-31 23:08:10

标签: c++ windows operator-overloading

Test.h:

class Test {
private:
    int value;

public:
    Test();
    int getValue();
    void setValue(int value);

    bool operator >(Test &l) {
        if (value > l.value) {
            return true;
        }
        return false;
    }
};

这会导致任何问题吗?如果是,将它实现到cpp文件的正确方法是什么?如果我试图将它实现为一个cpp文件,我会收到一个错误,说明参数的数量(因为该函数现在不在类中?)。

2 个答案:

答案 0 :(得分:5)

我说这些简单的函数这是理想的方法,因为它允许编译器内联它们,从而消除了函数开销。

但你应该尽可能使函数 const

所以:

class Test {
private:
    int value;

public:
    Test();
    int getValue();
    void setValue(int value);

    bool operator >(const Test &l) const { // be const correct!
        if (value > l.value) {
            return true;
        }
        return false;
    }
};

该功能根本不会修改数据成员,因此我将其标记为const。此外,参数不会更改,因此我也标记了const

如果你想要将它实现到一个单独的cpp文件中,那么你需要用类名限定它:

<强> Test.h

class Test {
private:
    int value;

public:
    Test();
    int getValue();
    void setValue(int value);

    bool operator >(const Test &l) const; // declare only
};

<强> Test.cpp的

// Qualify the name with Test::
bool Test::operator >(const Test &l) const { // be const correct!
    if (value > l.value) {
        return true;
    }
    return false;
}

此外,您还可以使用以下功能简洁

// Qualify the name with Test::
bool Test::operator >(const Test &l) const { // be const correct!
    return value > l.value;
}

答案 1 :(得分:0)

理论上,您应该使类对象尽可能小,并且可以在小型相关的非成员函数中执行所有操作。我怀疑你被叮咬的区别在于,在一个类中定义的非静态成员函数总是有一个'不可见'的第一个/最后一个参数(this指针)。你可能会忘记,但编译器不会......