c++中重要概念----初始化列表

构造函数初始化列表(应尽量使用初始化列表)

介绍

过去的赋值情况

class Function
{
public:
	Function(int n1, int n2)
	{
		num1 = n1;
		num2 = n2;
	}

private:
	int num1;
	int num2;
};

使用c++的初始化列表

class Function
{
public:
	Function(int n1, int n2):num1(n1),num2(n2){}

private:
	int num1;
	int num2;
};
使用初始化列表的好处

1)、比较直观的好处:使代码看上去更精简
2)、比较重要的好处:在简单的int等类型赋值时并没有明显的效率上的提升,但是在进行较复杂的类型赋值时,能够提升程序的效率,下面将详细解释

#include<iostream>
using namespace std;

class Base
{
public:
	Base()
	{
		cout << "Base构造函数" << endl;
	}

	Base(const Base& b)
	{
		cout << "--Base拷贝构造函数--" << endl;
	}
};

class Inher
{
public:
	Inher(Base& b):base(b){}		//base(b) 会调用拷贝构造函数
	Inher(Base& b)					//触发了Base对象的构造函数
	{
		base = b;
	}
private:
	Base base;
};

int main()
{
	Base b;
	Inher in(b);

	system("pause");
	return 0;
}

在使用初始化列表时,在参数初始化的时候是通过它本身的拷贝构造函数初始化的,拷贝构造函数一般使用引用后直接赋值,效率高,形如:

Base(Base& p)    
{ 
	m_pName = p.m_pName;         
}

若像以前那样在函数体中赋值,会在再次调用base的默认构造函数,若类较复杂,那将占用较多的时间来创建对象。

必须使用初始化列表的情况

1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接 调用拷贝构造函数初始化

  • 注意:
    成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的
class foo
{
public:
int i ;int j ;
foo(int x):i(x), j(i){}; // 正常, 先初始化i,后初始化j
foo(int x):j(x), i(j){}  // 报错
};

参考文章:
c++中的初始化列表详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值