C++初始化函数列表详细解析
C++中的类成员变量可以在构造函数中进行初始化,也可以在定义时进行初始化。另外,C++还可以使用初始化函数列表对类成员变量进行初始化。使用初始化函数列表可以消除因多个成员变量初始化而产生的繁琐问题,同时也可以提升代码执行效率。
什么是初始化函数列表?
初始化函数列表是一个以冒号开头的语句块,在一对圆括号内列出类的数据成员及其初始值。其基本语法格式为:
类名::构造函数(params) : 已定义成员变量名1(初始值), 已定义成员变量名2(初始值), ...已定义成员变量名N(初始值) {
// 构造函数体
}
初始化函数列表中的每个成员变量都需要被初始化,并且多个成员变量之间使用逗号分隔。
初始化函数列表与构造函数体执行顺序
C++标准规定,在执行构造函数体之前,初始化函数列表中的成员变量就已经完成了初始化。初始化函数列表中成员变量初始化的顺序与它们在类中定义的顺序一致,与它们在初始化函数列表中的顺序无关。因此,初始化函数列表的执行顺序与类成员变量的定义顺序有关,而与初始化函数列表中的成员变量顺序无关。
对于继承类成员,其初始化顺序与所继承的类中定义的顺序相同,与初始化函数列表中的顺序无关。
如果初始化函数列表中有类成员变量没有被初始化,则会调用默认构造函数进行初始化。
初始化函数列表的优点
使用初始化函数列表还有以下优点:
- 提升代码执行效率:使用初始化函数列表可以直接把成员变量的初始值写在一个代码块内,与构造函数体分开,所以可以提升代码执行效率。
- 初始化成员变量:若成员变量是个对象,那么就会调用它的拷贝构造函数来初始化它,而不是先调用默认构造函数然后再使用赋值运算符。
- 防止成员变量未初始化的问题:构造函数体中可以用赋值运算符对成员变量重新赋值,但如果该成员变量是一个常量或者一个引用类型,它就必须在初始化列表中进行初始化。否则会提示编译错误。
初始化函数列表的示例
假设我们定义了一个类Person
,其中包含姓名、性别和年龄三个变量,现在我们想给这三个变量进行初始化:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
// 初始化函数列表
Person(string n, char s, int a) : name(n), sex(s), age(a) {
cout << "构造函数被调用" << endl;
}
void Print() { // 成员函数
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "性别:" << sex << endl;
}
private:
string name; // 姓名
char sex; // 性别
int age; // 年龄
};
int main() {
// 初始化对象
Person p("张三", 'M', 20);
p.Print();
return 0;
}
运行结果:
构造函数被调用
姓名:张三
年龄:20
性别:M
同样的,我们还可以定义多个初始化参数来初始化不同的成员变量。举个例子:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
// 初始化函数列表
Person(string n, char s, int a) : name(n), sex(s), age(a) {
cout << "构造函数被调用" << endl;
}
void Print() { // 成员函数
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "性别:" << sex << endl;
}
private:
string name; // 姓名
char sex; // 性别
int age; // 年龄
};
class Student : public Person {
public:
// 初始化函数列表
Student(string n, char s, int a, string sno) : Person(n, s, a), sno(sno) {
cout << "构造函数被调用" << endl;
}
void Print() { // 成员函数
Person::Print();
cout << "学号:" << sno << endl;
}
private:
string sno; // 学号
};
int main() {
// 初始化对象
Student s("李四", 'F', 18, "001");
s.Print();
return 0;
}
运行结果:
构造函数被调用
构造函数被调用
姓名:李四
年龄:18
性别:F
学号:001
以上就是C++初始化函数列表的详细解析及两个示例,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++初始化函数列表详细解析 - Python技术站