做简单网站用什么软件,网站开发国外研究现状,常用网站建设技术,网站制作的服务怎么样构造函数的一项重要功能是对成员变量进行初始化#xff0c;为了达到这个目的#xff0c;可以在构造函数的函数体中对成员变量一一赋值#xff0c;还可以采用初始化列表。 C构造函数的初始化列表使得代码更加简洁#xff0c;请看下面的例子#xff1a; #include iostre…构造函数的一项重要功能是对成员变量进行初始化为了达到这个目的可以在构造函数的函数体中对成员变量一一赋值还可以采用初始化列表。 C构造函数的初始化列表使得代码更加简洁请看下面的例子 #include iostreamusing namespace std;class Student{private:char *m_name;int m_age;float m_score;public:Student(char *name, int age, float score);void show();};//采用初始化列表Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){//TODO:}void Student::show(){coutm_name的年龄是m_age成绩是m_scoreendl;}int main(){Student stu(小明, 15, 92.5f);stu.show();Student *pstu new Student(李华, 16, 96);pstu - show();return 0;}
运行结果小明的年龄是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 使用初始化列表其他成员变量还是一一赋值 Student::Student(char *name, int age, float score): m_name(name){m_age age;m_score score;}
注意成员变量的初始化顺序与初始化列表中列出的变量的顺序无关它只与成员变量在类中声明的顺序有关。请看代码 #include iostreamusing namespace std;class Demo{private:int m_a;int m_b;public:Demo(int b);void show();};Demo::Demo(int b): m_b(b), m_a(m_b){ }void Demo::show(){ coutm_a, m_bendl; }int main(){Demo obj(100);obj.show();return 0;}
运行结果2130567168, 100
在初始化列表中我们将 m_b 放在了 m_a 的前面看起来是先给 m_b 赋值再给 m_a 赋值其实不然成员变量的赋值顺序由它们在类中的声明顺序决定在 Demo 类中我们先声明的 m_a再声明的 m_b所以构造函数和下面的代码等价 Demo::Demo(int b): m_b(b), m_a(m_b){m_a m_b;m_b b;}
给 m_a 赋值时m_b 还未被初始化它的值是不确定的所以输出的 m_a 的值是一个奇怪的数字给 m_a 赋值完成后才给 m_b 赋值此时 m_b 的值才是 100。 obj 在栈上分配内存成员变量的初始值是不确定的。 初始化 const 成员变量
构造函数初始化列表还有一个很重要的作用那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用初始化列表。例如 VS/VC 不支持变长数组数组长度不能是变量我们自己定义了一个 VLA 类用于模拟变长数组请看下面的代码 class VLA{private:const int m_len;int *m_arr;public:VLA(int len);};//必须使用初始化列表来初始化 m_lenVLA::VLA(int len): m_len(len){m_arr new int[len];}
VLA 类包含了两个成员变量m_len 和 m_arr 指针需要注意的是 m_len 加了 const 修饰只能使用初始化列表的方式赋值如果写作下面的形式是错误的 class VLA{private:const int m_len;int *m_arr;public:VLA(int len);};VLA::VLA(int len){m_len len;m_arr new int[len];}