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

Kid*_*des 3 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

Gal*_*lik 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

该函数根本不修改数据成员,所以我已经标记了它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
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下功能更简洁:

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