C++ - 类中默认成员函数
2022/1/18 1:05:13
本文主要是介绍C++ - 类中默认成员函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
一、默认构造函数
二、析构函数
三、拷贝构造函数
四、赋值运算符重载
五、取地址及const取地址操作符重载
一、默认构造函数
构造函数名字与类名相同,并且没有返回值。创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
class Date { public : // 1.无参构造函数 Date () {} // 2.带参构造函数 Date (int year, int month , int day ) { _year = year ; _month = month ; _day = day ; } private : int _year ; int _month ; int _day ; };
构造函数的任务不是开辟空间而是将对象初始化。怎么初始化可以自己在函数中设置,也可以不写构造函数,这时系统会自动生成一个默认的构造函数,该函数对类的内置类型属性不处理,对自定义类的属性会调用该属性的构造函数。
class A {} class Date { private: //内置类型 int _year; int _month; int _day; //自定义类型 A a; };
二、析构函数
析构函数相对应构造函数,在对象生命周期结束之前调用一次析构函数,对该对象内部一些资源进行清理。
~Date() {}
其结构类型与构造函数相同,函数名是在类名前面加一个~,同样没有返回值。类中没有定义析构函数,系统会生成默认析构函数。该函数不会对内置类型属性处理,但若是有自定义类型属性,其会调用自定义类型属性的析构函数。
三、拷贝构造函数
上边的构造函数使用成员属性类型的参数作为构造函数来初始化对象,当我们使用相同类型的类作为参数,这时候就称之为拷贝构造函数。
Date ( Date& d ) { _year = d.year ; _month = d.month ; _day = d.day ; }
同样的我们不写拷贝构造函数,系统也会自动生成一个默认拷贝构造函数,但需要注意该函数只是按字节序的值进行浅拷贝。
拷贝构造函数中的参数要带引用。因为对象传参时要调用拷贝构造函数,如果不使用引用那么就会陷入要传参就要就行拷贝构造,要拷贝构造就要先传参,这样的无限递归循环。
四、赋值运算符重载
赋值运算符类似拷贝构造,我们可以将赋值运算符如下进行重载,也可以使用系统默认的赋值运算符,与默认拷贝构造相同也只是浅拷贝。
Date& operator=(const Date& d) { if(this != &d) { _year = d._year; _month = d._month; _day = d._day; } }
默认的赋值运算符与默认拷贝构造的主要区别就是,拷贝构造函数时将生成的对象拷贝给要创建的对象,而赋值针对的两个对象都是已经创建好的。
//拷贝构造 Date d1 = d2; Date d1(d2); //赋值 d1 = d2;
五、取地址及const取地址操作符重载
该操作符的重载也是如果我们不定义的话系统会自动生成。由于并不会有特别的需要,我们一般对取地址符不会去重载,就按照系统的默认重载来使用就行了。
Date* operator&() { return this ; } const Date* operator&()const { return this ; }
这篇关于C++ - 类中默认成员函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享