下面是关于"C++构造函数的初始化列表详解"的完整攻略。
一、初始化列表是什么?
在C++中,初始化列表是在类的构造函数中初始化成员变量的有效方式。通过初始化列表,可以显式地为一个或多个类成员变量设置初值。
通常来说,初始化列表位于构造函数的函数体之前,用冒号分隔。具体语法如下:
ClassName::ClassName(parameters) : member1(initial_value), member2(initial_value), ... {
// constructor body
}
在实际使用中,初始化列表通常用于初始化常量、引用和类对象等。
二、为什么需要初始化列表?
虽然可以使用赋值语句在构造函数体中初始化成员变量,但是这种做法有一个问题:
在构造函数体中,成员变量的构造函数会在执行赋值语句前被调用,这意味着成员变量会初始化两次:一次在构造函数启动时,一次在赋值语句之后。
这种初始化方式会增加程序的运行时间,因此初始化列表可以避免这种重复的初始化。
三、如何使用初始化列表?
1. 初始化常量成员变量
常量成员变量必须通过初始化列表进行初始化,因为它们无法在构造函数中赋值,例如:
#include <iostream>
class Shape {
public:
Shape(double r) : PI(3.1415926), radius(r) {
std::cout << "Shape constructed." << std::endl;
}
private:
const double PI; //必须在构造函数的初始化列表中初始化
double radius;
};
int main() {
Shape s(10.0);
return 0;
}
由于常量成员变量在声明时必须初始化,而它们无法在构造函数中赋值,所以在构造函数中必须使用初始化列表完成这项任务。
2. 初始化引用成员变量
引用成员变量也必须在构造函数的初始化列表中初始化,例如:
#include <iostream>
class Rectangle {
public:
Rectangle(int& w, int& h) : width(w), height(h) {
std::cout << "Rectangle constructed." << std::endl;
}
private:
int& width;
int& height;
};
int main() {
int w = 10, h = 20;
Rectangle r(w, h);
return 0;
}
在上面的例子中,引用成员变量必须在初始化列表中初始化,这样我们才能通过引用修改其他的变量。
3. 初始化类对象成员变量
在构造函数中初始化类对象成员变量时,可以选择使用构造函数的初始化列表,例如:
#include <iostream>
class Date {
public:
Date(int y, int m, int d) : year(y), month(m), day(d) {}
void show() {
std::cout << year << "-" << month << "-" << day << std::endl;
}
private:
int year;
int month;
int day;
};
class Student {
public:
Student(int id, Date b) : id(id), birth(b) {
std::cout << "Student constructed." << std::endl;
}
private:
int id;
Date birth;
};
int main() {
Date d(2022, 9, 21);
Student s(1001, d);
return 0;
}
在上面的例子中,我们使用了初始化列表初始化了Student的成员变量。特别地,我们使用了另一个自定义类Date来初始化birth成员变量。
四、总结
初始化列表是C++中初始化构造函数成员变量的有效方式,在构造函数体之前使用。初始化列表可以显式地为一个或多个类成员变量设置初值,并且可以用于初始化常量、引用和类对象等。初始化列表可以避免成员变量的重复初始化,提高程序效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++构造函数的初始化列表详解 - Python技术站