如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
我们在实现栈、队列等数据结构时,调用Init初始化,可能会忘记!导致崩溃出现随机值,
能不能保证对象一定被初始化?-- 构造函数(相当于一个初始化函数)
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,
但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
1.在构造函数时,如果存在缺省函数和半缺省参数的函数,有可能会出现调用歧义,存在二义性!
2.默认构造函数包括:无参的构造函数+全缺省的构造函数+我们没写编译器默认生成的构造函数
这些默认构造函数的特点:不用传参数就可以调用
3.关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??
4.默认生成构造函数,a:内置类型成员不做处理;b:自定义类型成员回去调用它的默认构造函数
5.对第5点的理解
如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
用户显式定义编译器将不再生成。
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由
编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作
1.在第三点中,默认生成析构函数特点:跟构造函数类似:
a、内置类型不处理;b、自定义类型回去调用它的析构函数
2.在日期类中的析构函数没有什么需要清理的,就可以不用写,用编译器自动生成的析构函数即可!
3.之前在学习栈这种数据结构的时候,我们做过一道题:用两个队列实现栈!
当时我们使用C语言进行编写,在结尾的时候我们不能直接return ,需要Destroy一下(麻烦且易忘)
在C++中,我们可以直接return st.Empty()(出了作用域,st自动调用析构函数)
那我们如何编写对于Stack自定义成员,调用Stack析构函数呢?
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),
在用已存在的类类型对象创建新对象时由编译器自动调用。
1.为什么拷贝构造函数要用引用传参,而不用指针传参?
在了解这个问题之前,我们先弄懂传值传参和传引用传参的区别!
解决办法:用引用,d是d1的一个别名。或者用指针(尽量用引用传参,用指针会有些怪,需要Date d2(&d2))
解决办法:加一个const避免这种情况,使权限缩小!
3.编译器生成的默认拷贝构造函数做了什么?
内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。按内存存储按字节序拷贝,==memcpy
要想更好地理解赋值运算符重载,最好自己模拟实现日期类!
运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
这两个默认成员函数一般不用重新定义 ,编译器默认会生成
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
以上就是今天要讲的内容,本文介绍类和对象的6大默认成员函数!日后会不断更新日期类的内容!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!