c/c++语言开发共享构造函数(二) 初始化列表

初始化列表 为了给类成员变量赋值,可以再构造函数的函数体内对成员变量赋值,也可以采用 初始化列表 。 如: 输出 10 20 30 40 可以看到,利用初始化列表赋值时,在参数之后与函数主体之间直接跟一个 , 后面是变量名,变量名后的括号内是给其所赋的值。 注意后面的括号,函数主体内只是没有内容,并 …


初始化列表

为了给类成员变量赋值,可以再构造函数的函数体内对成员变量赋值,也可以采用初始化列表
如:

#include <bits/stdc++.h> using namespace std; class a {     private :         int a, b;     public :         a(int x, int y) : a(x), b(y) {}         /*         相当于         a(int x, int y) {             a = x, b = y;         }         */         void print() {             printf("%d %dn", a, b);         } }; int main() {     a tmp(10, 20);     tmp.print();     a *p = new a(30, 40);     p->print();     return 0; }

输出

10 20
30 40

可以看到,利用初始化列表赋值时,在参数之后与函数主体之间直接跟一个 :, 后面是变量名,变量名后的括号内是给其所赋的值。注意后面的括号,函数主体内只是没有内容,并不是没有函数主体

使用初始化列表与赋值相比并没有什么效率上的提高,只是方便书写。

初始化列表可以对全部的成员变量进行初始化,也可以对局部的变量进行初始化。

#include <bits/stdc++.h> using namespace std; class a {     private :         int a, b;     public :         a(int x, int y) :  b(x) {             a = y;         }         void print() {             printf("%d %dn", a, b);         } }; int main() {     a tmp(10, 20);     tmp.print();     a *p = new a(30, 40);     p->print();     return 0; }

输出

20 10
40 30

特别注意,成员变量的初始化顺序与初始化列表中列出的类成员变量顺序无关,与类成员变量的声明顺序有关

#include <bits/stdc++.h> using namespace std; class a {     private :         int a, b;     public :         a(int x) : b(x), a(b) {}         void print() {             printf("%d %dn", a, b);         } }; int main() {     a tmp(10);     tmp.print();     a *p = new a(30);     p->print();     return 0; }

输出

4194304 10
4064376 30

稍微改一改之后

#include <bits/stdc++.h> using namespace std; class a {     private :         int b, a;   //注意这里      public :         a(int x) : b(x), a(b) {}         void print() {             printf("%d %dn", a, b);         } }; int main() {     a tmp(10);     tmp.print();     a *p = new a(30);     p->print();     return 0; }

输出

10 10
30 30

何时使用初始化列表

1. 类的成员变量被const修饰时

#include <bits/stdc++.h> using namespace std; class a {     private :         const int a;     public :         a(int x) : a(x) {}         void print() {             printf("%dn", a);         } }; int main() {     a tmp(10);     tmp.print();     a *p = new a(30);     p->print();     return 0; }

2. 初始化类的引用成员变量时

#include <bits/stdc++.h> using namespace std; class a {     private :         int &a;     public :         a(int x) : a(x) {}         void print() {             printf("%dn", a);         } }; int main() {     a tmp(10);     tmp.print();     a *p = new a(30);     p->print();     return 0; }

输出

10
30

3. 类的成员变量是对象,且这个对象只有含有参数的构造函数,没有默认构造函数。

#include <bits/stdc++.h> using namespace std; class a {     private :         int a, b;     public :         a(int x, int y) : a(x), b(y) {}         void print() {             printf("%dn", a * b);         } };  class b {     private :         a c;     public :         b(int x, int y) : c(x, y) {}         void query() {             c.print();         } };  int main() {     b tmp(10, 20);     tmp.query();     b *p = new b(30, 20);     p->query();     return 0; }

输出

200
600

4. 在派生类中初始化基类成员,调用基类的构造函数

#include <bits/stdc++.h> using namespace std; class a {     private :         int a;     public :         a(int x) : a(x) {             printf("value of a : %dn", a);         } };  class b : public a {     public :         b(int x) : a(x) {             printf("b was created.nn");         } };  int main() {     b tmp(10);     b *p = new b(30);     return 0; } 

输出

value of a : 10
b was created.

value of a : 30
b was created.

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/604485.html

(0)
上一篇 2021年5月12日
下一篇 2021年5月12日

精彩推荐