构造函数(二) 初始化列表
程序员文章站
2023-04-05 22:16:41
初始化列表 为了给类成员变量赋值,可以再构造函数的函数体内对成员变量赋值,也可以采用 初始化列表 。 如: 输出 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 %d\n", 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 %d\n", 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 %d\n", 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 %d\n", 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("%d\n", 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("%d\n", 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("%d\n", 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 : %d\n", a); } }; class b : public a { public : b(int x) : a(x) { printf("b was created.\n\n"); } }; 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.
上一篇: Web学习的第四天