网站首页 > 基础教程 正文
用参数初始化表对成员变量初始化
通过前面的学习,我们可以在类中定义带参数的构造函数。同时,在定义类对象的时候,给构造函数传递参数。通过给构造函数传递参数,可以给类的成员变量进行初始化。
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成员变量的构造函数;
执行完初始化列表之后,才执行构造函数的函数体。
所以,通过这个例子,我们可以清晰地看到构造函数初始化列表的执行过程。如果初始化的成员是一个类对象,那么,就调用该类对象的构造函数来初始化该成员,初始化成员列表的执行,是从右往左执行。当初始化列表执行完之后,才执行当前类的构造函数体。
猜你喜欢
- 2024-10-10 C++系列1-1:初探C++ c=2μf
- 2024-10-10 浅谈C++11(第9篇 可变参数模板) c++可变参数模板类
- 2024-10-10 数组的初始化方式有哪几种? 数组的初始化是什么意思
- 2024-10-10 c++对于内建类型的默认初始化 创建内部类的对象
- 2024-10-10 C++类构造函数,如何初始化对象?linux C++第27讲
- 2024-10-10 【C++编程语言】之 类和对象——对象的初始和消除
- 2024-10-10 C++基础语法梳理:引用、封装、继承和多态
- 2024-10-10 C++核心准则?:按照成员声明的顺序定义和初始化成员变量
- 2024-10-10 C++核心准则C.47:按照成员变量声明的次序定义和初始化数据成员
- 2024-10-10 C/C++语言编程系列002——不同情况下数组的初始化方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)