C++之再谈构造函数

1.1构造函数体赋值

在创建对象时,编译器要调用构造函数,给对象中各个变量进行赋值。

class Date
{
public:
	Date(int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

虽然说上述构造函数调用后,对象中已经有一个初值,但是这并不能称为对对象中成员变量的初始化。构造函数中的的语句只能被称为赋初值,而不是初始化。初始化只能进行一次,而赋值可以进行很多次。

1.2初始化列表的使用

初始化列表:以一个冒号开始,接着是一个以逗号分离的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};

注意事项:

1.每个成员变量在初始化列表只能初始化一次。

2.类中包含引用成员变量,const成员变量,自定义类型成员(且该类没有默认构造函数)必须使用初始化列表。

class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};
class B
{
public:
	B(int a,int ref)
		:tmp(a)
		,_ref(ref)
		,_n(5)
	{}
private:
	A tmp;//没有默认构造函数
	int& _ref;//引用
	const int _n;//const常量
};

3.尽量使用舒适化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会优先使用初始列表初始化。

class Time
{
public:
	Time(int day=0)
		:_day(day)
	{
		cout << "Time()" << endl;
	}
private:
	int _day;
};
class Test
{
public:
	Test(int num)
	{}
private:
	int _num;
	Time t;
};
int main()
{
	Test m(1);
}

4.成员变量在类中的声明次序就是在其初始化列表的初始化顺序,与其在初始化列表中的先后顺序不同。

class A
{
public:
	A(int a)
		:_a2(a)
		,_a1(_a2)
	{}
	void print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a1;
	int _a2;
};
int main()
{
	A m(1);
	m.print();
}//一道笔试题
A.输出1 1
B.程序崩溃
C.编译不通过
D.随机值 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值