虫子 运算符重载的一个好玩的
【摘要】 我们玩个好玩的==数组类====你不引用返回的话,就不可以修改对象====引用传参的话不仅可以减少拷贝,还可以修改对象==class Array{public: Array() { for (auto& e : _a) { e *= 10; } } //拷贝构造打印 Array(Array& a) { cout << "Array" << endl; } ~Array() ...
我们玩个好玩的
==数组类==
==你不引用返回的话,就不可以修改对象==
==引用传参的话不仅可以减少拷贝,还可以修改对象==
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; }
赋值运算符重载
赋值运算符主要有四点:
- 参数类型
- 返回值
- 检测是否自己给自己赋值
- 返回*this
- 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
==链式赋值拷贝==
==但是不排除一些人自己给自己赋值==
那么==编译器生成的默认赋值重载函数已经可以完成字节序的值拷贝==了,我们还需要自己实现吗?
//日期类 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) { } //赋值拷贝 d1 = d1; Date& operator=(const Date& d) { if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } private: int _year; int _month; int _day; }; int main() { Date d1(2022, 1, 1); Date d2; Date d3(2022,5,5); d1.Print(); d2.Print(); d3.Print(); //也是拷贝行为,但是不一样的是,拷贝构造是创建一个对象时,拿同类对象初始化的拷贝 //这里的赋值拷贝时两个对象都存在了,都被初始化过,现在想把一个对象赋值拷贝给另一个对象 d1 = d1; d1 = d2 = d3; d1.Print(); d2.Print(); d3.Print(); return 0; }
一个好玩的
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)