C++ 类与对象高级特性详解
一、再谈构造函数
构造函数是 C++ 中用于初始化对象的特殊函数。每次创建类的实例时,构造函数都会自动调用,用来为对象的成员变量赋初值。
1.1 构造函数的初始化方式
在 C++ 中,构造函数可以通过两种方式为类的成员变量赋值:构造函数体内赋值和初始化列表。
(1). 构造函数体内赋值
传统方式是通过构造函数体来对成员变量赋值:
class Person {
public:
Person(int age) { _age = age; // 在构造函数体内赋值 }
private:
int _age;
};
这种方式虽然常见,但可能带来效率问题,因为成员变量会经历两次赋值——默认初始化后再赋值。
(2). 初始化列表
初始化列表可以更高效地为成员变量赋值。其语法是在构造函数的参数列表后面使用冒号 :,直接对成员变量进行初始化:
class Person {
public:
Person(int age) : _age(age) {} // 使用初始化列表
private:
int _age;
};
使用初始化列表可以避免默认初始化后的重复赋值,因而效率更高。
1.2 必须使用初始化列表的场景
在某些情况下,初始化列表是唯一可行的选择:
1. 引用成员变量
引用类型必须在初始化时绑定对象,因此需要通过初始化列表来进行初始化,不能在构造函数体内赋值。
2. 常量成员变量
常量成员变量一旦被赋值便不能修改,必须在初始化列表中赋值,不能在构造函数体内赋值。
3. 没有默认构造函数的类类型成员
如果成员是其他类的对象且没有默认构造函数,则必须通过初始化列表进行初始化。否则,编译器无法为其分配默认初值,导致编译错误。
示例:
class Date {
public:
Date(int& year, int month = 1, int day = 1) : _year(year), _month(month), _day(day), _constValue(100) {}
:
& _year;
_constValue;
_month;
_day;
};


