C++程序设计课件 第十章 运算符重载
10.1 什么是运算符重载
10.2 运算符重载的方法
10.3 重载运算符的规则
10.4 运算符重载函数作为类成员函数和友元函数
10.5 重载双目运算符
10.6 重载单目运算符
10.7 重载流插入运算符和流提取运算符
10.8 不同类型数据间的转换
C++中的运算符重载是面向对象编程的一个重要特性,它允许程序员自定义某些运算符在类的对象上的操作方式。这意味着可以为新定义的数据类型赋予传统运算符的新含义,或者修改已存在数据类型的运算符含义。在本课程件中,我们将详细探讨运算符重载的相关知识点。
我们要了解什么是运算符重载。在C++中,运算符重载实际上是对运算符赋予新的含义。例如,对于内置数据类型,加号(+)用于数值相加,而对于字符串类型,则用于连接两个字符串。在C++中,我们也可以对自定义的类进行运算符重载,比如让加号(+)对复数对象执行加法操作。
接下来,我们来讨论运算符重载的方法。运算符重载可以通过两种方式实现:作为类成员函数和作为友元函数。作为类成员函数时,运算符函数会在类内声明,并且可以访问类的所有成员,包括私有成员。而作为友元函数时,它可以被看作是类的“外部”函数,因此它可以访问类的私有成员和保护成员,但需要在类外进行声明。
运算符重载还有一定的规则需要遵守。例如,运算符的优先级和结合性不能改变,不能创建新的运算符,不能重载的运算符包括:条件运算符(?:)、成员访问运算符(.和.*)、域解析运算符(::)、sizeof运算符和三元运算符(?:)。
重载双目运算符时,通常需要重载运算符函数作为类的成员函数,这样可以使用一个参数进行操作。例如,复数加法的运算符重载函数可能这样定义:
```cpp
class Complex {
public:
Complex operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
private:
double real;
double imag;
};
```
重载单目运算符时,如果要改变运算符的行为,则可能需要重载为类的成员函数;如果要改变运算符的操作数,则可能需要定义为友元函数。例如,为复数类重载一元负号运算符(-)可以这样写:
```cpp
class Complex {
public:
Complex operator-() const {
return Complex(-real, -imag);
}
friend Complex operator-(const Complex& a);
};
Complex operator-(const Complex& a) {
return Complex(-a.real, -a.imag);
}
```
在C++中,还可以重载流插入运算符(<<)和流提取运算符(>>),这样就可以直接使用标准输入输出流来处理自定义类型的数据。例如,重载一个复数类的流插入运算符:
```cpp
class Complex {
public:
friend ostream& operator<<(ostream& out, const Complex& c);
};
ostream& operator<<(ostream& out, const Complex& c) {
out << "(" << c.real << ", " << c.imag << ")";
return out;
}
```
不同类型数据间的转换也是运算符重载的一部分内容。在C++中,可以使用运算符重载来实现自定义类型与内置类型的转换,或者实现自定义类型之间的转换。例如,可以重载类型转换运算符将复数转换为字符串或其他类型。
例如,将复数转换为字符串的转换运算符可以这样实现:
```cpp
class Complex {
public:
operator string() const {
return "(" + to_string(real) + ", " + to_string(imag) + ")";
}
};
```
需要注意的是,尽管运算符重载在增强代码可读性和易用性方面非常有用,但它也有可能使代码变得难以理解,特别是当重载不恰当时。因此,在实际开发中,应该谨慎使用运算符重载,确保运算符重载后的意义直观明了,并与运算符的传统用法保持一致。
总结来说,运算符重载是C++编程语言提供的一种强大的特性,它允许我们为自定义类型提供自然和直观的操作方式。在学习和使用运算符重载时,应当掌握其定义方法、规则以及适用场景,以便在合适的时机运用这一特性,编写出更加优雅和高效的代码。