C++构造函数的深入理解

C++构造函数在给对象的成员变量进行赋值时,有两种方法一种构造函数体赋值,另一种初始化列表。 同时对象在经过构造函数体赋值后,虽然会有一个初始值,当这种不能够叫对象成员变量的初始化,是由于在构造函数体中可以多次改变成员变量的值,而初始化是指成员变量只能初始化一次。两者方法如下程序所示。同时构造函数初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

class Date
{
public:
	//两个构造函数任选一个
	Date(int year, int month, int day)//构造函数体赋值
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	Date(int year, int month, int day):_year(year),_month(month),_day(day)//初始化列表
	{
	
	}
private:
	int _year;
	int _month;
	int _day;
};

有了构造函数体赋值我们为什么还要使用构造函数的初始化列表呢,这是因为我们的类中有一下以下成员变量,必须放在初始化列表位置进行初始化。如1、引用成员变量 2、const 成员变量 3、自定义类型成员(该类没有默认构造函数)。如下程序所示。

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

到目前位置我们还没有说明白,构造函数中的构造函数体与初始化列表的不同,它们两个最大的不同是 初始化列表中是对象实例化时,当创建对象同时给对象进行初始化,而函数体是对象的变量创建以后在进行赋值,因此在用函数体给对象的变量进行初始化时,变量已经有了一个随机值,总的来说初始化列表时在对象变量创建时同时赋值进行初始化,而函数体中时对象变量创建后进行赋值,所以我们就解释了为什么const 变量和引用只能在初始化列表来对它们进行初始化,显而易见这些变量要在使用时,只能初始化一次,不能够在改变。如下程序是简单的两种构造函数的不同。

int main()
{
//两种构造函数给成员变量初始化的不同
	int p1;
	p1 = 0;//函数体中的构造

	int p2 = 0;//初始化列表
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值