构造函数 与 析构函数

对象的初始化

一般而言所有的对象都需要一个确定的初始状态。
没有初始化的对象,其内部成员变量的值是不定的
因此必须需要一个函数对类的对象进行初始化。

C++中的构造函数

C++中的类可以定义与类名相同的特殊成员函数。
这种与类名相同的成员函数叫做构造函数
构造函数在定义时可以有参数,但是没有任何返回类型的声明。

举例说明:
这里写图片描述

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

举例说明:
这里写图片描述

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

举例说明:
这里写图片描述

两个特殊的构造函数:

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

拷贝构造函数:
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制。

举例说明:
这里写图片描述

复制构造函数的参数不能用传值,只能引用,因为如果为传值,在函数运行时,函数内部会产生一个新的副本来接收实参的值,从而又要调用复制构造函数,造成死循环,因此只能用引用。

如果类中一个构造函数都没有写,则编译器自动提供无参构造函数和拷贝构造函数,但是如果已经存在有某种构造函数,则编译器不提供无参构造函数,但仍然会提供拷贝构造函数。

C++中的对象组合

在类中,可能包含了其他类的对象,则在初始化时,要对这些对象同时进行初始化。
对象组合举例:
这里写图片描述
在上面的程序中,Test类这样写会报错,因为没有初始化m1,m2,而且c成员变量也没有初始化。因为在M类的定义中没有无参的构造函数,因此无法给m1和m2进行初始化。

C++中提供了初始化列表对成员变量进行初始化。
语法规则:

Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3) //构造函数
{
    // some other assignment operation
}

成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关。
初始化列表先于构造函数的函数体执行。

初始化列表使用举例:

class Test
{
private:
    const int c;
    M m1;
    M m2;
public:
    Test() : c(1), m2(3), m1(2)
    //初始化列表,用法:对象名(构造函数的参数)
    {
        printf("Test()\n");
    }
}

类中的const成员是肯定会被分配空间的,类中的const成员变量只是一个只读变量

类中的变量不能在定义的时候直接进行初始化,必须在函数中进行初始化。

初始化与赋值不同:
初始化是用已存在的对象或值对正在创建的对象进行初值设置。
赋值是用已存在的对象或值对已经存在的对象进行值设置。

对象的销毁

一般而言所有被销毁的对象都需要做清理。
如果对象销毁前没有做清理,那么很可能造成资源泄漏。
在构造函数中申请的资源,需要在对象销毁前释放。

C++中的析构函数

C++中的类可以定义一个特殊的成员函数清理对象。
这个特殊的成员函数叫做析构函数
定义:~ClassName()

析构函数没有参数也没有任何返回类型的声明。
析构函数在对象销毁时自动被调用。

析构函数举例:
这里写图片描述

构造函数和析构函数的调用次序

构造函数的调用次序:
当类中有成员变量是其它类的对象时:
1、首先调用成员变量或其他类对象的构造函数,调用顺序与声明顺序相同
2、之后调用自身类的构造函数。

析构函数的调用秩序与对应的构造函数调用秩序相反。
现调用自身的析构函数,然后按照与调用构造函数相反的顺序调用成员对象的析构函数。

小结

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

析构函数是C++中对象销毁时做清理工作的特殊函数。
析构函数在对象销毁时自动被调用。
析构函数是对象所使用的资源及时释放的保障。
析构函数的调用秩序与构造函数相反。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值