C++程序设计
### C++程序设计中的运算符重载 #### 10.1 什么是运算符重载 运算符重载是C++编程语言中的一个重要特性,它允许程序员为自定义类型(如用户定义的类或结构体)重定义C++内置运算符的行为。这意味着,通过运算符重载,可以为这些运算符提供新的意义,使其能够操作用户定义的数据类型。 例如,如果有一个`Complex`类表示复数,通常情况下,我们不能直接使用加法运算符`+`来实现两个`Complex`对象的相加。但是,通过运算符重载,我们可以定义`Complex`类的行为,使得两个`Complex`对象能够像基本数值类型那样被相加。 #### 10.2 运算符重载的方法 运算符重载可以通过定义成员函数或者友元函数来实现。成员函数和友元函数各有优缺点: - **成员函数**:当需要修改当前对象的状态时,通常使用成员函数。例如,当两个复数相加时,我们可以定义一个成员函数来更新当前对象的状态。 - **友元函数**:友元函数不是类的成员,但可以访问类的私有成员。使用友元函数可以更方便地处理非成员运算符重载,比如赋值运算符`=`等。 #### 10.3 重载运算符的规则 重载运算符时,需要注意以下规则: 1. **不可创建新的运算符**:只能重载已经存在的运算符。 2. **运算符优先级和结合性不变**:一旦运算符被重载,其优先级和结合性不会改变。 3. **至少有一个操作数必须是用户定义的类型**:至少有一个操作数应该是用户定义的类型,这样才能有意义地重载该运算符。 4. **重载运算符不能改变运算符的语法**:例如,二元运算符仍然需要两个操作数。 5. **不能重载的运算符**:有一些运算符不能被重载,比如`.`, `::`, `? :`, `.*`等。 #### 10.4 运算符重载函数作为类成员函数和友元函数 - **成员函数**:当一个运算符被重载为成员函数时,它会自动接收当前对象作为其第一个隐式参数。这意味着,对于二元运算符,只需要一个显式参数即可。 - 例如,如果定义了`Complex`类的加法运算符重载成员函数`operator+`,则可以使用`Complex c1 + c2`这样的表达式,其中`c1`是当前对象。 - **友元函数**:当一个运算符被重载为友元函数时,它需要所有操作数作为显式参数。这通常用于非成员运算符的重载,如`operator+`。 - 例如,定义`Complex`类的加法运算符重载友元函数`operator+`,则可以使用`Complex c1 + c2`这样的表达式。 #### 10.5 重载双目运算符 双目运算符涉及两个操作数。在C++中,常见的双目运算符包括加法`+`、减法`-`、乘法`*`、除法`/`等。重载双目运算符时,需要注意操作数的顺序和类型。 #### 10.6 重载单目运算符 单目运算符只涉及一个操作数。常见的单目运算符包括负号`-`、逻辑取反`!`、按位取反`~`等。重载单目运算符时,通常需要考虑是否返回一个新的对象还是修改当前对象。 #### 10.7 重载流插入运算符和流提取运算符 流插入运算符(`<<`)和流提取运算符(`>>`)通常用于输入输出。重载这些运算符可以使用户定义的类型能够在`cout`和`cin`等标准输入输出流上使用。 #### 10.8 不同类型数据间的转换 通过重载类型转换运算符,可以在不同类型的用户定义对象之间进行转换。这对于需要将用户定义的对象转换为内置类型(如`int`或`double`)的情况非常有用。 ### 示例代码解析 以下是对例10.1的详细解析: ```cpp #include <iostream> using namespace std; class Complex { // 定义Complex类 public: Complex() { real = 0; imag = 0; } // 定义构造函数 Complex(double r, double i) { real = r; imag = i; } // 构造函数重载 Complex complex_add(Complex& c2); // 声明复数相加函数 void display(); // 声明输出函数 private: double real; // 实部 double imag; // 虚部 }; Complex Complex::complex_add(Complex& c2) { Complex c; c.real = real + c2.real; c.imag = imag + c2.imag; return c; } void Complex::display() { // 定义输出函数 cout << "(" << real << "," << imag << ")"; } ``` 在这个例子中,我们定义了一个名为`Complex`的类来表示复数,并提供了两个构造函数以及一个成员函数`complex_add`来实现两个复数的相加。此外,还定义了一个成员函数`display`用于输出复数。这个例子展示了如何使用成员函数实现运算符重载的功能。
剩余408页未读,继续阅读
- 金协庆2014-04-07相当的不错,很适合初学者学习。
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助