【C++】图解类和对象(中)

类和对象(中)


文章目录

  • 类和对象(中)
  • 一、类的6个默认成员函数
  • 二、构造函数
    • 1.定义
    • 2.特性
    • 3.对特性的理解及几点注意事项
  • 三、析构函数
    • 1.定义
    • 2.特性
    • 3.对特性的理解及几点注意事项
  • 四、拷贝构造函数
    • 1.性质
    • 2.特性
    • 3.对特性的理解及几点注意事项
  • 五、赋值运算符重载
    • 1.运算符重载
    • 2.赋值运算符重载
    • 3.取地址及const取地址操作符重载
  • 总结


一、类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类
空类中真的什么都没有吗?不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
【C++】图解类和对象(中)_第1张图片


二、构造函数

1.定义

我们在实现栈、队列等数据结构时,调用Init初始化,可能会忘记!导致崩溃出现随机值,
能不能保证对象一定被初始化?-- 构造函数(相当于一个初始化函数)


2.特性

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,
但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
【C++】图解类和对象(中)_第2张图片


3.对特性的理解及几点注意事项

1.在构造函数时,如果存在缺省函数和半缺省参数的函数,有可能会出现调用歧义,存在二义性!
【C++】图解类和对象(中)_第3张图片


2.默认构造函数包括:无参的构造函数+全缺省的构造函数+我们没写编译器默认生成的构造函数
这些默认构造函数的特点:不用传参数就可以调用
【C++】图解类和对象(中)_第4张图片


3.关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??

【C++】图解类和对象(中)_第5张图片


4.默认生成构造函数,a:内置类型成员不做处理;b:自定义类型成员回去调用它的默认构造函数
【C++】图解类和对象(中)_第6张图片


5.对第5点的理解
如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
用户显式定义编译器将不再生成。

【C++】图解类和对象(中)_第7张图片


【C++】图解类和对象(中)_第8张图片


三、析构函数

1.定义

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由
编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作


2.特性

【C++】图解类和对象(中)_第9张图片


3.对特性的理解及几点注意事项

1.在第三点中,默认生成析构函数特点:跟构造函数类似:
a、内置类型不处理;b、自定义类型回去调用它的析构函数


2.在日期类中的析构函数没有什么需要清理的,就可以不用写,用编译器自动生成的析构函数即可!
【C++】图解类和对象(中)_第10张图片


3.之前在学习栈这种数据结构的时候,我们做过一道题:用两个队列实现栈!
当时我们使用C语言进行编写,在结尾的时候我们不能直接return ,需要Destroy一下(麻烦且易忘)
在C++中,我们可以直接return st.Empty()(出了作用域,st自动调用析构函数)

那我们如何编写对于Stack自定义成员,调用Stack析构函数呢?
【C++】图解类和对象(中)_第11张图片


四、拷贝构造函数

1.性质

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),
在用已存在的类类型对象创建新对象时由编译器自动调用。
【C++】图解类和对象(中)_第12张图片


2.特性

【C++】图解类和对象(中)_第13张图片


3.对特性的理解及几点注意事项

1.为什么拷贝构造函数要用引用传参,而不用指针传参?
在了解这个问题之前,我们先弄懂传值传参和传引用传参的区别
【C++】图解类和对象(中)_第14张图片

解决办法:用引用,d是d1的一个别名。或者用指针(尽量用引用传参,用指针会有些,需要Date d2(&d2))


2.在拷贝构造函数传参时尽量加 const
【C++】图解类和对象(中)_第15张图片

解决办法:加一个const避免这种情况,使权限缩小!


3.编译器生成的默认拷贝构造函数做了什么?
内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。按内存存储按字节序拷贝,==memcpy
【C++】图解类和对象(中)_第16张图片


4.有的时候浅拷贝会程序崩溃,所以我们要尽量自己实现深拷贝
【C++】图解类和对象(中)_第17张图片


五、赋值运算符重载

要想更好地理解赋值运算符重载,最好自己模拟实现日期类!

1.运算符重载

运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)


【C++】图解类和对象(中)_第18张图片


2.赋值运算符重载

【C++】图解类和对象(中)_第19张图片


3.取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!


总结

以上就是今天要讲的内容,本文介绍类和对象的6大默认成员函数!日后会不断更新日期类的内容!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
【C++】图解类和对象(中)_第20张图片

你可能感兴趣的:(C++成神之路,c++)