本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
- C++ 入门到入土!!!学习合集
- Linux 从命令到网络再到内核!学习合集
本期内容:C++ 类的基本成员函数:赋值运算符重载【初步介绍运算符重载:后续有阶段小项目对应实现示例】
目录:
1. 运算符重载的认识
2. 运算符重载函数写法
3. 运算符重载函数的注意点
4. 运算符重载的探讨:类内与类外写法区别
- - 4.1 类内写法
- - 4.2 类外写法
5. 赋值运算符的重载(特殊点)【类的第五种基本成员函数】
6. 相关文章推荐
【 C++学习合集链接 】
1. 运算符重载的认识
C++为了 增强代码的可读性 引入了 运算符重载;
运算符重载是具有特殊函数名的函数。其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
2. 运算符重载函数写法
函数名字为:关键字 operator 后面接需要重载的运算符符号。
函数原型:返回值类型 operator 操作符 (参数列表)
【 代码示例说明如下 】
/* 相等运算符重载 */
bool operator == (对象1,对象2){}等号重载/* 大于运算符重载 */
bool operator > (对象1,对象2){}大于重载/* 流插入运算符重载 */
istream operator >> (对象1,对象2){}流插入运算符重载
3. 运算符重载函数的注意点
不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数。
用于内置类型的运算符,其含义不能改变,例如:内置的整型+,本义:加和,不能改成其他:如做差。
作为类成员函数重载时,其形参看起来比操作数数目少 1,因为成员函数的第一个参数为隐藏的 this。(强调)【相关文章说明:类的this指针:C++ 学习 ::【基础篇:11】:C++ 类的基本使用与非静态 this 指针(两个面试考点):类的空指针问题(this指针可以为空吗?) | this指针存在哪里?】
.、.*、 ::、 sizeof、 ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。
4. 运算符重载的探讨:类内与类外写法区别
运算符的重载应该写全局还是局部?还是都可以?如果都可以,有什么区别?
答:两者都可以,但是有区别!区别应取决于重载对象,而且有的运算符推荐使用类内重载!
以 等号 重载为例:
- 参数:全局写法:两个对象;局部写法:一个对象(因含有隐含参数 this 指针标识了一个对象);
- 成员变量访问限制:全局写法:可能受限(取决于访问限制符);局部写法:不受限制;
代码示例
#include<iostream>
using std::endl;
using std::cout;class Date {
public:Date(int year = 1970, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};int main() {return 0;
}
4.1 类内写法
- 只需一个参数(第二个参数);【隐含 this 指针:是第一个参数】
- 类内访问类成员属性/变量无约束!
/*局部写法:即写在类的内部,无成员变量的访问限制等问题;且参数列表写一个参数即可!
*/
bool operator == (const Date& d){return this->_year == d._year && this->_month == d._month && this->_day == d._day;
}
4.2 类外写法
- 需要两个参数,分别作为运算符的左右操作数;
- 由于可能受访问类成员属性/变量的限制,需要提供类外访问接口;【如下代码中的说明!】
bool operator == (const Date& d1, const Date& d2){return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
}/*注意:以上全局写法访问成员变量是会被限制的,而解决访问一般是在类中设计返回数据接口的方式实现问题的解决!(其他方式:私有成员公有化)
*//* 类中添加公有成员函数 */
int GetYear(){ return _year; }
int GetMonth(){ return _month; }
int GetDay(){ return _day; }/* 全局写法修改 */
bool operator == (const Date& d1, const Date& d2){return d1.GetYear() == d2.GetYear() && d1.GetMonth() == d2.GetMonth() && d1.GetDay() == d2.GetDay();
}
5. 赋值运算符的重载(特殊点)【类的第五种基本成员函数】
点此跳转
5. 相关文章推荐
1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
4. C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数
5. C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用