为什么需要初始化列表

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;
}



posted @   helloweworld  阅读(1003)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
点击右上角即可分享
微信分享提示