行业知识
【C++奇妙冒险】拷贝构造函数、运算符重载(赋值重载|const成员|取地址重载|const取地址重载)
2026-10-31 16:34:14
来源:互联网转载
文章目录
- 前言
- 拷贝构造函数
- 概念
- 特征
- 默认生成的拷贝构造
- default关键字(浅谈)
- 运算符重载
- 概念
- 运算符重载注意事项
- 封装如何保证?
- 赋值运算符重载
- 赋值运算符重载格式
- 返回值引用和不加引用的区别
- 赋值运算符只能重载成类的成员函数不能重载成全局函数
- 编译器生成的默认赋值运算符重载
- const成员
- const 成员
- const修饰成员函数
- 小结
- 思考
- 取地址及const取地址重载
- 取地址重载
- const取地址重载
- 取地址重载和const取地址重载一般不需要重载
前言
拷贝构造函数
创建对象时,可否创建一个与已存在的对象一模一样的新对象呢?
可以的
用拷贝构造就能做到:
Date d1(2024, 5, 28);Date d2(d1);return 0;
什么原理?我们下面会讲,反正不是张力…
概念
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在已存在的类类型对象创建新对象时,由编译器自动调用。
特征
拷贝构造函数也是特殊成员函数,特征如下:
- 拷贝构造函数是构造函数的一个重载形式
- 拷贝构造的参数只有一个且必须是类类型对象的引用(必须使用引用)
注:使用传值方式编译器直接报错,因为会引发无穷递归调用
- 若未显示定义,编译器会生成默认的拷贝构造
默认的拷贝构造函数对象按内存存储,按字节序完成拷贝(浅拷贝or值拷贝) 原型:类名 (const 类名& 形参) 例如:Date(const Date& d)
拷贝构造函数的用法:
代码:
#includeusing namespace std;class Date{public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}// 拷贝构造函数// Date d2(d1)Date(const Date& d) // 不传引用会无限递归调用{_year = d._year;_month = d._month;_day = d._day;}void Print(){cout Date d1(2024, 5, 28);d1.Print();Date d2(d1); //拷贝构造 ,生成一个和d1一模一样的对象d2.Print();return 0;}public:// 构造函数Time(int hour = 1, int minute = 1, int second = 1){_hour = hour;_minute = minute;_second = second;}// 拷贝构造 Time(const Time& t){_hour = t._hour;_minute = t._minute;_second = t._second;cout public:// 构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:// 内置类型int _year;int _month;int _day;// 自定义类型Time _t;};int main(){Date d1(2024, 5, 28);// 用已经存在的 d1 拷贝构造 d2 此处会调用Date类的拷贝构造// 但Date类并未显示定义拷贝构造 则编译器会为Date类自动生成一个默认拷贝构造函数Date d2(d1);return 0;}public://拷贝构造函数Time(const Time& t){_hour = t._hour;_minute = t._minute;_second = t._second;}private:int _hour;int _minute;int _second;};class Date{public:private:// 内置类型int _year;int _month;int _day;// 自定义类型Time _t;};int main(){Date d1;Date d2(d1);return 0;}public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}//private:int _year;int _month;int _day;};// d1 == d2bool operator==(const Date& d1, const Date& d2){return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;}int main(){Date d1(2024, 5, 28);Date d2(2024, 5, 27);cout public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// d1 == d2// 函数原型:bool operator==(Date* this,const Date& d2)// 这里需要注意的是,左操作数是this,指向调用函数的对象bool operator==(const Date& d2){return _year == d2._year&& _month == d2._month&& _day == d2._day;}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 20);Date d2(2024, 5, 21);cout public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}Date& operator=(const Date& d){// &d 是取地址if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;// 返回左操作数d1}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 28);Date d2(2024, 5, 27);d1 = d2;// 两个已经存在的对象return 0;}...}Date operator=(const Date& d) // 去掉引用{...}public:// 构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 拷贝构造Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;cout if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;//返回d1}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 28);Date d2(2024, 5, 20);Date d3(2024, 5, 21);d1 = d2 = d3;return 0;}if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;};// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数Date& operator=(Date& left, const Date& d){if (&left != &d){left._year = d._year;left._month = d._month;left._day = d._day;}return left;}// 报错public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 28);Date d2(2024, 5, 20);d1 = d2;return 0;}public:Time(int hour = 1, int minute = 1, int second = 1){_hour = hour;_minute = minute;_second = second;}Time& operator=(const Time& t){if (this != &t){_hour = t._hour;_minute = t._minute;_second = t._second;}return *this;}private:int _hour;int _minute;int _second;};class Date{public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;Time _t;};int main(){Date d1(2024, 5, 20);Date d2(2024, 6, 21);d1 = d2;return 0;}public:Date(){_year = 2024;_month = 5;_day = 29;}void Print(){cout Date d1;d1.Print();Date d2;d2.Print();return 0;}public:Date(){_year = 2024;_month = 5;_day = 29;}void Print(){cout Date d1;d1.Print();// 同样的代码 就加了个关键字const Date d2;d2.Print();return 0;}public:Date(){_year = 2024;_month = 5;_day = 29;}void Print() const{cout Date d1;d1.Print();const Date d2;d2.Print();return 0;}public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date* operator&(){// this是指针,指向对象地址,返回this就是返回对象地址return this;}private:int _year;int _month;int _day;};int main(){Date d1(2024, 5, 28);cout public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}const Date* operator&() const{return this;}private:int _year;int _month;int _day;};int main(){const Date d1(2024, 5, 28);cout public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main(){const Date d1(2024, 5, 28);cout
上一篇:服务器怎么控制软件的运行?