c++基础学习7-c++构造函数和析构函数

1,对象的初始化

初始状态是对象普遍存在的一个状态。

没有初始化的对象,其内部成员变量的值是不定的。

2,构造函数

在c++中可以定义与类名相同的特殊成员函数,叫做构造函数

构造函数在定义时可以有参数,但是没有任何返回类型的声明(void和无返回值是不一样的)

构造函数的调用

    一般情况下c++编译器会自动调用构造函数
在一些情况下则需要手动调用构造函数

下面我们来看一个例子:

3,成员函数的重载


类的成员函数和普通函数一样可以进行重载,并遵守相同的重载规则

最后的结果为,调用的重载的类的成员函数

4,特殊的构造函数

    1,无参构造函数

              当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空

    2,拷贝构造函数

当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的复制。
例1:
例2:
这个例子会出错,为什么呢?
因为:
1,当类中没有定义任何一个构造函数,c++编译器会为其提供无参构造函数和拷贝构造函数。
2,当类中定义了任意的非无参构造函数或者拷贝构造函数时,c++编译器不会为其提供无参构造函数,所以会导致出错。

总结:
构造函数是c++用于初始化对象状态的特殊函数
构造函数在对象被创建时自动调用
构造函数和普通成员函数都遵循重载规则
拷贝构造函数是对象正确初始化的重要保证

5,c++中对象的组合与初始化列表

    我们知道在类定义中,成员变量不可以赋初值,我们如何将一个类定义成另一个类的成员变量呢?

在c++中提供了初始化列表,可以对成员变量进行初始化。
例:

从结果可以看出,
1,我们的初始化列表先被执行。
2,成员变量的初始化顺序与初始化列表的顺序无关,而与成员变量声明的顺序有关。
3,初始化列表优先于构造函数的函数体执行。

6,对象的销毁:析构函数

        下面有两个问题:

1,为什么在销毁对象之前都需要做清理?

答:1,如果对象在销毁前没有做清理,那么很可能造成资源泄露。

2,在构造函数中申请的资源需要在对象销毁前释放。   

         2,c++中为什么用析构函数进行清理呢?

答:c++之所以自动调用的析构函数进行清理主要原因是,其一如果不用自动调用,当我们定义多个对象的时候,并且对每个对象都申请了资源,那么当我们释放资源的时候就需要对每个对象都释放内存,这样会很麻烦, 其二,我们自己的函数都需要显示的调用,而析构函数就不需要,系统在对象销毁的时候自动被调用。

例:

7,构造函数与析构函数的调用次序

1,当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用次序与声明次序相同,之后调用自身类的构造函数(成员变量的构造函数优先于自身的构造函数)

2,析构函数的调用次序与对象的构造函数调用次序相反(知道构造函数的顺序,就知道了析构函数的次序 )


总结:1,析构函数是c++对象销毁时做清理工作的特殊函数。
           2,析构函数在对象销毁时自动被调用。
   3,析构函数的调用次序与构造函数相反。
   4,析构函数能及时的释放资源,避免不必要的麻烦。
问:可以直接调用构造函数么?
答案是:直接调用构造函数是合法的,因为构造函数时一个特殊的函数,只可以被编译器调用或者在声明一个对象时手动调用,如果既不是被编译器调用,也不是定义一个对象时调用,那么会产生一个临时对象,然后马上被析构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值