C++构造函数和析构函数

        类是一种用户自定义的类型,声明一个类对象时,编译程序要为对象分配存储空间,进行必要的初始化。在C++中,由构造函数来完成。与构造函数对应的是析构函数,当撤销类对象时,析构函数回收存储空间,并做一些善后工作。构造函数和析构函数都属于类,既可以由用户提供,也可以由系统自动生成。

       

>构造函数的定义

        构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一种特定的状态,使该对象具有区别于其他对象的特征。构造函数在对象被创建的时候由系统自动调用。构造函数也是类的成员函数,但它是一种特殊的成员函数,它除了具有一般成员函数的特性之外,还具有:

                  (1)构造函数的名字必须与类名相同

                  (2)构造函数不指定返回类型,它隐含有返回值,由系统内部调用

                  (3)构造函数可以有一个或多个参数,因此构造函数可以重载

                  (4)在创建对象时,系统会自动调用构造函数

        示  例:

class date{
public:
	date(int x,int y,int z);
private:
	int a,b,c
};
date::date(int x,int y,int z):a(x),b(y),c(z)
{
	cout<<"this is a test!\n";
}
        构造函数的功能就是对对象进行初始化,即对数据成员进行初始化。类外定义构造函数中的冒号后面是一个构造函数的初始化列表,用于初始化类中各个数据成员。

        初始化列表位于构造函数的形参表之后,函数体代码前,由一个冒号和由逗号分隔的若干项构成。每一个构造函数的初始化列表都由数据成员标识符和其后的括号表达式构成,即每个独立的成员都必须以     成员名(表达式) 进行初始化。

        在构造函数中,初始化列表优先于赋值。在调用构造函数对类对象初始化时,先执行初始化列表对各个成员进行初始化,再执行构造函数体。初始化列表中各个初始化项的执行顺序取决于类成员在类中声明的顺序,而与初始化列表中给出的初始化项的顺序无关。如果在构造函数的初始化列表中没有对某个成员进行显式初始化,则表示对该成员进行了默认初始化。如果对所有成员都进行了默认初始化,那么可以省略构造函数的初始化列表。


>析构函数的定义

        析构函数与构造函数的作用几乎正好相反,它用来完成对象被删除前的一些清理工作,也就是专门做扫尾工作的。一般情况下,析构函数在对象的生存期即将结束的时候由系统自动调用。它的调用完成之后,对象也就消失了,相应的内存空间也被释放。它具有以下一些特性:

                  (1)析构函数名是在类名前加求反(求补)符号~

                  (2)析构函数不指定返回类型,它隐含有返回值,由系统内部使用

                  (3)析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数

                  (4)在撤销对象时,系统会自动调用析构函数

        注:析构函数的调用顺序与构造函数的调用顺序是完全相反的。


>默认构造函数和默认析构函数

        默认构造函数就是调用时不必提供参数的构造函数。默认构造函数的函数名与类名相同,它的参数表或者为空,或者它的所有参数都具有默认值。

        如果类中定义了一个默认构造函数,则使用该函数;如果一个类中没有定义任何构造函数,编译器将生成一个不带参的公有默认构造函数,它的定义格式:

                     <类名>::<类名>( ){ }

        每个类都必须有一个析构函数。如果一个类没有定义析构函数,编译器将生成一个公有的析构函数,即默认析构函数,它的定义格式:

                     <类名>::~<类名>( ){ }


>复制构造函数(拷贝构造函数)

        类中有一种特殊的构造函数叫做复制构造函数,它用一个已知的对象初始化一个正在创建的同类对象。

        格式:

                          <类名>::<类名>(const <类名>& <引用对象名>)

                          {

                              //

                           }

          特点:

                       (1)也是一种构造函数,因此函数名与类名相同,并且不能指定函数返回类型

                       (2)只有一个参数,是对同类的某个对象的引用。

                       (3)每一个类中都必须有一个复制构造函数。如果类中没有声明复制构造函数,编译器会自动生成一个具有上述形式的公有复制构造函数


          注:一般复制构造函数会在以下三种情况下会被调用:

                  #用类的一个已知的对象去初始化该类的另一个正在创建的对象

                  #采用传值调用方式时,对象作为函数实参传递给函数形参

                  #对象作为函数返回值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值