《C++ Primer Plus》第十章 对象和类-构造函数和析构函数

        C++目标之一是让使用类像使用标准类型一样,但上一讲提供的代码不能实现初始化int或结构那样初始化Stock对象,即常规的初始化句法不适用于类型Stock,原因如下:

        (1)数据部分的访问状态是私有的,意味着程序不能直接访问数据成员

        (2)程序只能通过成员函数来访问数据成员,因此需要合适的成员函数才能成功将对象初始化。

        (3)若使数据成员成为公有,而非私有,违背了类的一个重要初衷--数据隐藏

        因此,C++提供了一个特殊成员函数--类构造函数,专门用于构造新对象,将值赋予对应数据成员。例如,Stock类一个可能的构造函数是Stock()的成员函数,构造函数的原型和函数头有明显特征---虽然没有返回值,但没有被声明为void类型,实际上,构造函数并没有声明类型。

1.1声明和定义构造函数

        现在需要创建Stock的构造函数,第一个参数为指向字符串的指针,n和pr参数为成员提供值, 注意:没有返回值类型,原型位于类声明公有部分。

        Stock(const char * co , int n = 0 , double pr = 0.0 )

        亦可将函数定义为较多内容,并且程序声明对象时,将自动调用构造函数。

Stock::Stock(const char * co, int n, double pr)
{
Std::strncpy(company, co , 29);
Company[29] = ‘\0’;
If(n<0)
{
Std::cerr<<”number of shares can’t be negative”;
Shares= 0;
}
Else
Shares = n;
Share_val = pr;
Set_tot( );
}

注意:构造函数参数名不能与类成员相同,因为构造函数的参数表示不是类成员,而是赋给类成员的值,为了避免这种混乱,通常数据成员名中使用m_前缀。

1.2 使用构造函数

        (1)显式调用构造函数

        Stock food = Stock(“World Cabbage” , 250, 1.25);

        (2)隐式调用构造函数

Stock food (“World Cabbage” , 250, 1.25);

        (3)构造函数与new同时使用

Stock *pstock= new Stock(“World Cabbage” , 250, 1.25);//创建一个Stock对象,将其初始化为参数提供的值,并将该对象的地址赋给pstock指针。

1.3 默认构造函数

        默认构造函数是在未提供显式的初始化值时,用于创建对象的构造函数。

        Stock stock1;//如果没有提供任何构造函数,C++将自动提供默认构造函数,不作任何工作。

对于Stock类来说,默认构造函数可能如下:

        Stock::Stock(){ }

注意:当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数,为类定义了构造函数后,程序员就需要为其提供默认构造函数;如果要创建对象,而不显式地初始化,则必须定义一个不接受任何参数的默认构造函数;默认构造函数只能有1个!

1.4 析构函数

        构造函数创建对象后,程序负责跟踪该对象,直到对象使用结束,对象使用结束后,程序将自动调用一个特殊的成员函数,即析构函数,用于完成清理工作。

        例如,构造函数使用new分配内存,则析构函数将使用delete来释放内存,即便构造函数没有使用new,只需要让编译器产生一个什么都不执行的隐式析构函数即可。

        析构函数在类名前加上(~),Stock类的析构函数为~Stock(),析构函数也可以没有返回值和声明类型,并且没有参数。

1.4.1 什么时候调用析构函数呢?

        (1)如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用;

        (2)如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象时在其中定义的)自动被调用;

        (3)如果对象时通过new创建,则将其驻留在堆栈内存或自由存储区中,当使用delete来释放内存时,析构函数自动被调用;

        (4)程序可以创建临时变量完成特定的操作,程序在结束对该对象的使用自动调用其析构函数。

1.5 小结

1.5.1构造函数

        (1)构造函数是一种特殊的类成员函数,在创建类对象时被调用;

        (2)构造函数的名称和类名相同,但通过函数可以重载,可以创建多个同名的构造函数,条件是每个函数的特征参数列表都不同;

        (3)构造函数没有声明类型,常用于初始化类成员对象,初始化应与构造函数的参数列表匹配;

1.5.2 默认构造函数

        (1)默认构造函数没有参数,若创建对象没有进行显式地初始化,则将调用默认构造函数;

        (2)如果程序没有提供任何构造函数,编译器会为程序定义1个默认构造函数;

        (3)默认构造函数可以没有任何参数,如果有则必须给所有参数都提供默认值。

1.5.3 析构函数

        (1)析构函数在对象执行结束后自动调用;

        (2)每个只能有1个析构函数(无返回值类型,无void,也没参数),其名称为类名称前加~

        (3)若构造函数使用了new,则必须提供使用delete的析构函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值