📜  C++中的运算符重载(1)

📅  最后修改于: 2023-12-03 15:14:03.898000             🧑  作者: Mango

C++中的运算符重载

在C++中,可以通过运算符重载来为自定义类型添加自定义的操作。运算符重载可以使代码更加直观易读,并且可以使自定义类型更加灵活。

运算符重载的基本概念

运算符重载是指重新定义一个已有的运算符来使用自定义类型。当使用该运算符时,会自动调用我们所定义的函数,完成我们所指定的操作。在C++中,运算符重载定义的方法是在函数名前面添加operator关键字。

例如,我们可以为自定义类型Point重载加号运算符,使其能够进行点的相加操作。具体实现方式如下:

class Point {
private:
    int x, y;
public:
    Point(int x, int y) : x(x), y(y) {}
    Point operator+(const Point& p) const {
        return Point(x + p.x, y + p.y);
    }
};

在上述代码中,我们重载了加号运算符,并定义了函数:

Point operator+(const Point& p) const {
    return Point(x + p.x, y + p.y);
}

意思是将两个Point对象相加,返回一个新的Point对象。

运算符重载的常见问题
运算符重载函数的参数

运算符重载函数是普通函数,它们的参数和返回值可以自定义类型。比如,我们可以为自定义类型String重载加号运算符,将它们拼接起来:

class String {
private:
    char* str;
public:
    String(const char* str) {
        // ...构造函数代码...
    }
    String operator+(const String& other) const {
        // ...重载加号运算符代码...
    }
};

int main() {
    String s1("Hello"), s2(" World");
    String s3 = s1 + s2; // 调用运算符重载函数
    return 0;
}

在上述代码中,重载加号运算符函数的参数是一个const引用,类型为String&,它表示右侧的操作数。

运算符重载函数的返回值

运算符重载函数通常要返回一个值,以便进行后续操作。尽管可以返回任意类型,但通常需要返回一个新的自定义类型对象。

例如,在上述代码中,由于重载加号运算符函数的作用是将两个String对象拼接起来,我们需要返回一个新的String对象来表示结果。

运算符重载的全局函数和成员函数

运算符重载既可以是全局函数,也可以是成员函数。如果我们希望重载运算符的左操作数为自定义类型,那么就需要使用成员函数;如果左操作数为C++内置类型或其他自定义类型,那么我们可以使用全局函数。

例如,在上述代码中,我们在类的成员函数内定义了加号运算符,这是因为加号运算符的左操作数为自定义类型String。

如果我们现在想要为自定义类型String重载等于运算符,比较两个String对象是否相等:

class String {
private:
    char* str;
public:
    String(const char* str) {
        // ...构造函数代码...
    }
};

bool operator==(const String& s1, const String& s2) {
    // ...重载等于运算符代码...
}

int main() {
    String s1("Hello"), s2(" World"), s3("Hello");
    bool b1 = s1 == s2; // 调用全局函数
    bool b2 = s1 == s3; // 调用全局函数
    return 0;
}

在上述代码中,我们在全局函数内定义了等于运算符。由于等于运算符的左右操作数都是自定义类型String,因此我们选择使用全局函数进行运算符重载。

运算符重载的注意事项

虽然运算符重载非常有用,但是有一些注意事项需要我们注意。以下是一些需要注意的地方:

  • 不要过度使用运算符重载。有些操作比较复杂,最好使用单独的函数来完成;
  • 不能重载内置运算符的含义。例如,我们不能改变加号运算符的含义;
  • 不能创建新的运算符。C++中已经有了一组固定的运算符,我们不能再创建新的运算符;
  • 对于一些特殊运算符(例如递增和递减运算符),它们可以用全局函数进行重载,但是推荐使用成员函数进行重载。
总结

运算符重载是C++独有的语言特性之一,它允许我们为自定义类型添加自定义的操作。我们可以通过运算符重载使代码更加直观易读,并且可以使自定义类型更加灵活。在实际编程过程中,我们需要注意不要过度使用运算符重载,遵循约定俗成的规范,以便我们编写出更加易于理解和维护的代码。