C++程序设计课件 ch10 运算符重载
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++编程语言提供的一种强大的特性,它允许我们为自定义类型提供自然和直观的操作方式。在学习和使用运算符重载时,应当掌握其定义方法、规则以及适用场景,以便在合适的时机运用这一特性,编写出更加优雅和高效的代码。
- nuist-nju2013-10-18非常不错的资源,谢谢贺老师
- 心情阿少2014-05-22课件内容做的十分详细,很好,只是上面实例过于简单了
- 文杰天煜2015-02-03贺老师的C++课程讲得很好,资源很好,谢谢分享!
- ejxqy2014-11-29讲得挺好的,做复习很有用。
- Payen_Cheung2013-04-19讲的非常好,受益匪浅,多谢老师
- 粉丝: 3w+
- 资源: 137
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助