构造函数
特点
- 没有返回值
- 支持函数重载
- 对象实例化时,编译器自动调用
- 作用不是构造,而是初始化
- 函数名与类名相同
- 无参函数和全缺省的函数,不用传参就能调用的函数叫做默认构造函数
构造函数是一个特殊的成员函数
注:无参构造函数在实例化时,不需要增加(),原因:会与函数声明混淆
无参和有参的构造函数不能同时存在,原因:调用会存在歧义
构造函数如果自己写了,那么编译器就不会自动生成,以下就是自己写了构造函数,编译器没有自动生成,导致定义的对象找不到对应的构造函数出现的错误
构造函数对于内置类型不做处理(一般是随机值),自定义类型会调用它对应的构造函数(如果自己显式定义,编译器会自动生成无参构造函数)
析构函数
特征:
- 关键符号“~”,在函数名前加~
- 在对象的生命周期结束时,编译器自动调用
- 无参数无返回值
- 不支持函数重载
- 析构顺序:先定义的后析构
析构顺序
局部对象(后定义先析构)>局部的静态>全局对象(后定义先析构)
拷贝构造函数
特点:
- 拷贝构造是构造函数的一种重载形式
- 拷贝构造在传参时,需要引用传参,不能传值传参(会引发无穷递归)
- 拷贝构造如果没有显示定义,编译器会主动生成一个,默认的拷贝构造根据内存存储的大小进行拷贝,这种叫做浅拷贝/值拷贝
编译器默认生成的只能用于浅拷贝的构造,不例外有时候会遇到一些需要深拷贝的对象(例如自定义需要用malloc开辟空间的对象,仅仅是浅拷贝不行,容易造成析构重复同一块空间)
当拷贝构造完结束后,d2会自动调用析构函数,析构函数就会析构掉指向的空间,此时d1成为野指针。因此需要深拷贝,让d2拷贝一块与d1指向的空间一样大小的内存,这样就可以避免野指针出现