回复
c++冥殿 类和对象 他化自在 拷贝构造,运算符重 原创
模块师
发布于 2022-1-18 17:32
浏览
1收藏
春节不停更,此文正在参加「星光计划-春节更帖活动」https://harmonyos.51cto.com/posts/9923
类与对象
类的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; }
我们玩个好玩的
==数组类==
==你不引用返回的话,就不可以修改对象==
==引用传参的话不仅可以减少拷贝,还可以修改对象==
class Array { public: Array() { for (auto& e : _a) { e *= 10; } } //拷贝构造打印 Array(Array& a) { cout << "Array" << endl; } ~Array() { } //[]方括号解引用也是运算符 int& operator[](size_t pos) { //访问pos那个位置的数据 return _a[pos]; } private: int _a[10] = {0,1,2,3,4,5,6,7,8,9}; }; int main() { Array a; cout << a[0] << endl; cout << a[1] << endl; cout << a[2] << endl; cout << a[3] << endl; a[0] = 100; a[1] = 100; a[2] = 100; a[3] = 100; cout << a[0] << endl; cout << a[1] << endl; cout << a[2] << endl; cout << a[3] << endl; return 0; }
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 10:30:09修改
赞
1
收藏 1
回复
相关推荐