为什么需要初始化列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /**************************************************** # File : main.cpp # Author : lucasysfeng # Revision : 2014-10-13 17:04:43 # Description : ****************************************************/ #include <iostream> using namespace std; class A { public : A() { cout << "A constructor" << endl; } ~A() { cout << "A destructor" << endl; } A( const A&) { cout << "A copy" << endl; } A& operator=( const A) { cout << "A assign" << endl; return * this ; } }; class B { public : B() { cout << "B constructor" << endl; } // B(const A a) { _a = a; cout << "B constructor with arg" << endl; } B( const A a) : _a(a) { cout << "B constructor with arg" << endl; } ~B() { cout << "B destructor" << endl; } B( const B&) { cout << "B copy" << endl; } B& operator=( const B) { cout << "B assign" << endl; return * this ;} private : A _a; }; int main( int argc, char ** argv) { A a; B b(a); return 0; } |
一般构造函数可以对数据成员赋值,那为什么需要初始化列表
举一个例子就可反证,有的数据成员并不能通过赋值进行初始化,因此初始化列表是必要的。
Effective C++
1.有些情况下必须用初始化——特别是const和引用数据成员只能用初始化,不能被赋值。
2.成员初始化列表的效率比赋值的效率高。
(在构造函数实现中赋值,需要调用构造函数和赋值构造函数;而用成员初始化列表只需
调用拷贝构造函数。)
下面程序错误:
#include <iostream> using namespace std; class Test { private: const int a; public: Test() {a = 0;} //error,不能对const数据成员初始化。 }; int main() { return 0; }
下面程序正确:
#include <iostream> using namespace std; class Test { private: const int a; public: Test(): a(0) {} }; int main() { return 0; }
分类:
语言C++
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞