构造函数-用参数初始化表对成员变量初始化
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数-用参数初始化表对成员变量初始化相关的知识,希望对你有一定的参考价值。
用参数初始化表对成员变量初始化
通过前面的学习,我们可以在类中定义带参数的构造函数。同时,在定义类对象的时候,给构造函数传递参数。通过给构造函数传递参数,可以给类的成员变量进行初始化。
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构造函数的函数体。而是优先执行“初始化列表”,而且,初始化列表的从右往左执行,有如下的执行过程:
- 执行 len(l) 语句,给 len 成员变量初始化,调用length成员变量的构造函数;
- 执行 wid(w) 语句,给 wid 成员变量初始化,调用width成员变量的构造函数;
- 执行 he(h) 语句,给 he 成员变量初始化,调用height成员变量的构造函数;
执行完初始化列表之后,才执行构造函数的函数体。
所以,通过这个例子,我们可以清晰地看到构造函数初始化列表的执行过程。如果初始化的成员是一个类对象,那么,就调用该类对象的构造函数来初始化该成员,初始化成员列表的执行,是从右往左执行。当初始化列表执行完之后,才执行当前类的构造函数体。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于构造函数-用参数初始化表对成员变量初始化的主要内容,如果未能解决你的问题,请参考以下文章