虫子 拷贝构造 运算符重载
【摘要】 类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,==任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数== 拷贝构造函数构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。 特征==拷贝构造函数==也是特殊的成员函数,其特征如下:拷贝构造函数是==构造函数的...
类的6个默认成员函数
如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,==任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数==
拷贝构造函数
构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
特征
==拷贝构造函数==也是特殊的成员函数,其特征如下:
- 拷贝构造函数是==构造函数的一个重载形式==。
- 拷贝构造函数的==参数只有一个==且==必须使用引用传参==,使用==传值方式会引发无穷递归调用==。
- ==若未显示定义,系统生成默认的拷贝构造函数==。 默认的拷贝构造函数对象按内存存储==按字节序完成拷贝==,这种拷贝我们叫做==浅拷贝==,或者值拷贝。
==但是这样就会引发一些问题==
==当有资源指向的时候就不可以用浅拷贝==
赋值运算符重载
运算符重载
==C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,==也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
==函数名字为:关键字operator后面接需要重载的运算符符号==。
==函数原型:返回值类型 operator操作符(参数列表)==
注意:
- 不能通过==连接其他符号==来创建新的操作符:比如operator@
- 重载操作符必须有一个类类型或者枚举类型的操作数
- 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
- 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
- .* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现
==运算符重载的实现==
//日期类 class Date { public: //构造函数不写,编译器会自动生成构造函数,所以构造函数也是默认成员函数 Date(int year = 2022, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } //我们不写拷贝构造,编译器会自动生成默认的拷贝构造 //拷贝构造 /*Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; }*/ void Print() { cout << _year << "-" << _month << "-" << _day << endl; } //判断日期是否相等 bool operator==(Date x2) { return _year == x2._year && _month == x2._month && _day == x2._day; } //判断左边是否小于右边 bool operator<(Date x2) { if (_year < x2._year) return true; else if(_year == x2._year) { if (_month < x2._month) return true; else if(_month == x2._month) { if (_day < x2._day) return true; } } return false; } //日期加天数 返回的还是日期 Date operator+(int day) { } //日期减天数 返回的还是日期 Date operator-(int day) { } //日期减日期 返回的是天数 int operator-(Date d2) { } private: int _year; int _month; int _day; }; int main() { Date d1(2022, 1, 1); Date d2(2022, 1, 1); cout << (d1 == d2) << endl; cout << (d1 < d2) << endl; return 0; }
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)