C++中默认构造函数的使用细节

C++中默认构造函数的使用细节

默认构造函数是在未提供显式初始值时,用来创建对象的构造函数。也就是说,它是用于下面这种声明的构造函数:

Stock fluffy_the_cat; // uses the default constructor

程序清单10.3就是这样做的!这条语句管用的原因在于,如果没有提供任何构造函数,则C++将自动提供默认构造函数。它是默认构造函数的隐式版本,不做任何工作。对于 Stock 类来说,默认构造函数可能如下:

Stock::stock() { }

因此将创建 fufy the cat对象,但不初始化其成员,这和下面的语句创建x,但没有提供值给它一样:

int x;

默认构造函数没有参数,因为声明中不包含值。奇怪的是,当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。如果提供了非默认构造函数(如 Stock(const char*co,int n,doublepr)),但没有提供默认构造函数,则下面的声明将出错:

Stock stock1; //not possible with current constructor

这样做的原因可能是想禁止创建未初始化的对象。然而,如果要创建对象,而不显式地初始化,则必须定义一个不接受任何参数的默认构造函数。定义默认构造函数的方式有两种。一种是给已有构造函数的所有参数提供默认值:

Stock(const string & co = "Error",int n = 0,double pr = 0.0);

另一种方式是通过函数重载来定义另一个构造函数–一个没有参数的构造函数:

Stock();

由于只能有一个默认构造函数,因此不要同时采用这两种方式。实际上,通常应初始化所有的对象,以确保所有成员一开始就有已知的合理值。因此,用户定义的默认构造函数通常给所有成员提供隐式初始值。例如,下面是为 Stock类定义的一个默认构造函数:

Stock::Stock()        //default constructor
{
    company = "no name";
    shares = 0;
    share_val = 0.0;
    total_val = 0.0;
}

提示:在设计类时,通常应提供对所有类成员做隐式初始化的默认构造函数。参见【0voice C++】使用上述任何一种方式(没有参数或所有参数都有默认值)创建了默认构造函数后,便可以声明对象
变量,而不对它们进行显式初始化:

Stock first;                // calls default constructor implicitly
Stock first = Stock();      // calls it explicitly
Stock *prelief = new Stock; // calls it implicitly

然而,不要被非默认构造函数的隐式形式所误导:

Stock first("Concrete Conglomerate");  // calls constructor
Stock second();                        // declares a function
Stock third;                           // calls default constructor

第一个声明调用非默认构造函数,即接受参数的构造函数;第二个声明指出,second()是一个返回 Stock对象的函数。隐式地调用默认构造函数时,不要使用圆括号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值