构造函数中,有哪几种情形只能用初始化列表,而不能用函数体中对数据成员赋值? 请给出代码,用对比法(即采用和未采用初始化列表两种形式)并进一步说明
时间: 2024-02-12 15:07:54 浏览: 82
在以下情况下必须使用初始化列表:
1. 对于`const`数据成员和引用类型数据成员,因为它们在对象创建后不能再被修改,所以必须在构造函数中初始化。
2. 对于没有默认构造函数的类类型数据成员,因为在进入构造函数的函数体之前,成员子对象已经被默认构造函数初始化了,如果在函数体中再次赋值,则相当于先调用默认构造函数,再调用赋值运算符,这样做会浪费时间。而使用初始化列表可以直接调用合适的构造函数进行初始化。
下面是一个例子,说明了在初始化列表和函数体中分别对成员变量进行初始化的区别:
```c++
#include <iostream>
using namespace std;
class Person {
public:
// 构造函数
Person(const string& name, int age): m_name(name), m_age(age) {
// 在函数体中对成员变量赋值,而不是使用初始化列表
// m_name = name; // 错误!
// m_age = age; // 错误!
}
// 打印信息
void printInfo() {
cout << "Name: " << m_name << ", Age: " << m_age << endl;
}
private:
const string m_name;
int m_age;
};
int main() {
Person p1("Tom", 20);
p1.printInfo();
return 0;
}
```
在上面的代码中,`Person`类有一个`const string`类型的数据成员`m_name`和一个`int`类型的数据成员`m_age`。构造函数中使用了初始化列表对它们进行了初始化,而注释掉的函数体中的赋值语句是错误的。如果采用函数体中的赋值语句,则会编译错误,因为`const`数据成员只能在初始化列表中进行初始化。
阅读全文