为啥会有构造函数和析构函数,个人认为还是图省事。
如果没有构造函数,每一次初始化都需要手动调用初始化方法,一个两个还好说,那要是1000大小的数组呢??所以我们希望能让编译器帮我们自动的进行对象属性初始化。
构造函数
定义:c++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数。
1 在对象创建时自动调用,完成初始化相关工作。
2 无返回值,与类名同,默认无参,可以重载,可默认参数。
3 一经实现,默认不复存在。
默认构造函数
如果用户并没有指定构造函数,那创建对象时自动调用默认无参构造函数(或默认拷贝构造函数),否则调用用户定义构造函数
1)默认无参构造函数
编译器默认提供,函数体为空
2)默认有参构造函数
编译器默认提供,简单的进行成员变量值的复制,为浅拷贝,关于浅拷贝和深拷贝的区别,后面再分析。
自定义构造函数
当类中定义了拷贝构造函数,c++编译器不会提供无参构造函数
当类中定义了有参构造函数,c++编译器不会提供无参构造函数
1.无参构造函数
2.有参构造函数
3.拷贝构造函数
由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由
拷贝 构造器来完成。拷贝构造器的格式是固定的。
class A
{
public:
A(const A &another){
}
}
4.构造函数初始化列表
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成 员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进 行初始化,就必须调用这个类成员的带参数的构造函数, 如果没有初始化列表,那么他将无法完成第一步,就会报错
class B
{
public:
B():a1_(参数),a2_(参数)//调用A类的构造函数完成初始化
{
}
private:
A a1_;
A a2_;
}
深拷贝和浅拷贝区别
浅拷贝:只是复制指针变量的值,指向同一块内存,不会开辟新的内存空间
深拷贝:会开辟新的内存空间
默认的拷贝构造函数提供浅拷贝,要想完成深拷贝需要自定义拷贝构造函数。
浅拷贝有时在某些情况下析构会出现问题
析构函数
定义
C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数 叫做析构函数.
规则:
1 对象销毁时,自动调用。完成销毁的善后工作。
2 无返值 ,与类名同。无参。不可以重载与默认参数
析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作
比如在删除对象前,释放在堆上分配的内存空间
class D
{
public:
~D(){
//析构体
}
}