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

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构造函数的函数体。而是优先执行“初始化列表”,而且,初始化列表的从右往左执行,有如下的执行过程:

  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

以上是关于构造函数-用参数初始化表对成员变量初始化的主要内容,如果未能解决你的问题,请参考以下文章

12.2 C++常对象成员

12.2 C++常对象成员

12.2 C++常对象成员

使用与 C++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量? [复制]

11.6 C++构造函数重载

11.6 C++构造函数重载