博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造函数初始化列表
阅读量:4223 次
发布时间:2019-05-26

本文共 2178 字,大约阅读时间需要 7 分钟。

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用初始化列表。

构造函数的初始化列表使得代码更加简洁,请看下面的例子:

 
  1. #include <iostream>
  2. ug namespace std;
  3.  
  4. class Student{
  5. private:
  6. char *m_name;
  7. int m_age;
  8. float m_score;
  9. public:
  10. Student(char *name, int age, float score);
  11. void show();
  12. };
  13.  
  14. //采用初始化列表
  15. Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
  16. //TODO:
  17. }
  18. void Student::show(){
  19. cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
  20. }
  21.  
  22. int main(){
  23. Student stu("小明", 15, 92.5f);
  24. stu.show();
  25. Student *pstu = new Student("李华", 16, 96);
  26. pstu -> show();
  27.  
  28. return 0;
  29. }

运行结果:

小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96
如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添加了一个冒号:,后面紧跟m_name(name), m_age(age), m_score(score)语句,这个语句的意思相当于函数体内部的m_name = name; m_age = age; m_score = score;语句,也是赋值的意思。
使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。
初始化列表可以用于全部成员变量,也可以只用于部分成员变量。下面的示例只对 m_name 使用初始化列表,其他成员变量还是一一赋值:

 
  1. Student::Student(char *name, int age, float score): m_name(name){
  2. m_age = age;
  3. m_score = score;
  4. }

注意,成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。请看代码:

 
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Demo{
  5. private:
  6. int m_a;
  7. int m_b;
  8. public:
  9. Demo(int b);
  10. void show();
  11. };
  12.  
  13. Demo::Demo(int b): m_b(b), m_a(m_b){ }
  14. void Demo::show(){ cout<<m_a<<", "<<m_b<<endl; }
  15.  
  16. int main(){
  17. Demo obj(100);
  18. obj.show();
  19. return 0;
  20. }

运行结果:

2130567168, 100
在初始化列表中,我们将 m_b 放在了 m_a 的前面,看起来是先给 m_b 赋值,再给 m_a 赋值,其实不然!成员变量的赋值顺序由它们在类中的声明顺序决定,在 Demo 类中,我们先声明的 m_a,再声明的 m_b,所以构造函数和下面的代码等价:

 
  1. Demo::Demo(int b): m_b(b), m_a(m_b){
  2. m_a = m_b;
  3. m_b = b;
  4. }

给 m_a 赋值时,m_b 还未被初始化,它的值是不确定的,所以输出的 m_a 的值是一个奇怪的数字;给 m_a 赋值完成后才给 m_b 赋值,此时 m_b 的值才是 100。

obj 在栈上分配内存,成员变量的初始值是不确定的。

初始化 const 成员变量

构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用初始化列表。例如 VS/VC 不支持变长数组(数组长度不能是变量),我们自己定义了一个 VLA 类,用于模拟变长数组,请看下面的代码:

 
  1. class VLA{
  2. private:
  3. const int m_len;
  4. int *m_arr;
  5. public:
  6. VLA(int len);
  7. };
  8.  
  9. //必须使用初始化列表来初始化 m_len
  10. VLA::VLA(int len): m_len(len){
  11. m_arr = new int[len];
  12. }

VLA 类包含了两个成员变量,m_len 和 m_arr ,需要注意的是 m_len 加了 const 修饰,只能使用初始化列表的方式赋值,如果写作下面的形式是错误的:

 
 
  1. class VLA{
  2. private:
  3. const int m_len;
  4. int *m_arr;
  5. public:
  6. VLA(int len);
  7. };
  8.  
  9. VLA::VLA(int len){
  10. m_len = len;
  11. m_arr = new int[len];
  12. }

 

转载地址:http://jghmi.baihongyu.com/

你可能感兴趣的文章
Java并发编程从入门到精通 张振华.Jack --我的书
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十二篇:世界上最快的捷径【张振华.Jack】
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
《浪潮之巅》1 AT&T
查看>>
《浪潮之巅》2蓝色巨人 IBM公司
查看>>
《浪潮之巅》3水果公司的复兴
查看>>
《浪潮之巅》4计算机工业的生态链
查看>>
《浪潮之巅》5奔腾的芯 英特尔公司
查看>>
python语言程序设计基础笔记(三)从题目到方案
查看>>
读取txt文件出现出现多余空行问题
查看>>
从理论到实践开发自己的聊天机器人
查看>>
@***装饰器(python)
查看>>
我的2020
查看>>
2.3 WSN的MAC协议
查看>>
栈与队列的应用——计算表达式的值
查看>>
BFS——求矩阵中“块”的个数
查看>>
BFS——走迷宫的最小步数
查看>>
并查集——好朋友
查看>>
关键路径
查看>>