构造函数-用参数初始化表对成员变量初始化

用参数初始化表对成员变量初始化

       通过前面的学习,我们可以在类中定义带参数的构造函数。同时,在定义类对象的时候,给构造函数传递参数。通过给构造函数传递参数,可以给类的成员变量进行初始化。

C++还提供另一种初始化成员变量的方法:参数初始化表

在构造函数的参数中,通过参数初始化表来对成员变量进行初始化。这种方法不在函数体内对成员变量初始化,而是在函数首部实现。对于上面提到的student类定义,构造函数可以改用以下形式:

       程序运行结果如下:

       构造函数的参数初始化列表,就是在原来函数首部的末尾加一个冒号,然后,列出参数的初始化表。如下:

student(char* pn, char* pa, long long n):name(pn), addr(pa), number(n)

       上面的初始化列表是:

name(pn), addr(pa), number(n)

相当于:

(1) name = pn, 使用形参 pn 赋值给 name 成员变量;

(2) addr = pa, 使用形参 pa 赋值给 addr 成员变量;

(3) number = n, 使用形参 n 赋值给 number 成员变量;

       这种写法方便,简练,尤其当需要初始化的成员变量较多时更显其优越性。甚至可以直接在类体中(而不是在类外)定义构造函数。

       下面我们举例分析一个更加复杂的例子,看看初始化列表的执行过程,是从左到右,还是,从右到左。

       首先,我们要定义一个“箱子”类型,箱子有长、宽、高的属性。那么,定义类的名称是Box,然后,Box中 有长、宽、高的成员变量。这些成员变量,我们定义一个类来存放数据,测试代码如下:

       所以,就有height类,存放“高”属性;width类存放“宽”属性,length类存放“长”属性。然后,定义Box类如下:

       可以看到,在Box构造函数中,初始化列表是:

he(h), wid(w), len(l)

       此时,使用h参数,对he成员变量进行初始化,使用w参数对wid成员变量初始化,使用l参数对len成员变量进行初始化。

       然后,在volume()函数中计算体积时,使用he、wid、len成员变量的值来计算。测试的main()函数,如下:

       程序运行结果如下:

       可以看到,在定义box1对象的时候,调用如下:

Box box1(12, 25, 30);

此时,调用Box构造函数,但是,并没有马上执行Box构造函数的函数体。而是优先执行“初始化列表”,而且,初始化列表的从右往左执行,有如下的执行过程:

  1. 执行 len(l) 语句,给 len 成员变量初始化,调用length成员变量的构造函数;
  2. 执行 wid(w) 语句,给 wid 成员变量初始化,调用width成员变量的构造函数;
  3. 执行 he(h) 语句,给 he 成员变量初始化,调用height成员变量的构造函数;

执行完初始化列表之后,才执行构造函数的函数体。

所以,通过这个例子,我们可以清晰地看到构造函数初始化列表的执行过程。如果初始化的成员是一个类对象,那么,就调用该类对象的构造函数来初始化该成员,初始化成员列表的执行,是从右往左执行。当初始化列表执行完之后,才执行当前类的构造函数体。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦凯峰Linux编程学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值