深入探索构造函数--------------之构造函数初始化

一   类的成员变量有两种初始化方式:

      1.初始话列表

      2.构造函数体内进行赋值

      但是尽量使用初始化列表进行初始化,因为它更高效,为什么更高效呢?   

#include<iostream>
using namespace std;
class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
	}
	Time&operator=(const Time&t)
	{
		if (this != &t)
		{
			cout << "Time&operator=(const Time&t)" << endl;
			return *this;
		}
	}
public:
	int _hour;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1, int hour = 0)
		:_year(year)
		, _month(month)
		, _day(day)

	{
		_t._hour = hour;
		cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
	Time _t;
};
int main()
{
	Date d1;
	system("pause");
	return 0;
}


附上代码如下

#include<iostream>
using namespace std;
class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
	}
	Time(const Time&t)
	{
		cout << "Time(const Time&t)" << endl;
	}
	Time&operator=(const Time&t)
	{
		if (this != &t)
		{
			cout << "Time&operator=(const Time&t)" << endl;
			return *this;
		}
	}
private:
	int _hour;
};
class Date
{
public:
	/*Date(int year, int month , int day , const Time& t)
		:_year(year)
		, _month(month)
		, _day(day)
		, _t(t)

	{
		
		cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
	}*/
	Date(int year, int month, int day, const Time& t)

	{
		_year = year;
		_month = month;
		_day = day;
		_t = t;
		cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};
int main()
{
	Time t;
	Date d1(2017,1,9,t);
	system("pause");
	return 0;
}

二  必须在初始化列表初始化的成员变量

    1 常量成员变量(const修饰常量创建时必须初始化)

    2 引用类型成员变量(引用创建时必须初始化)

    3 没有缺省构造函数的类成员变量

给出代码,读者自行测试

#include<iostream>
using namespace std;
class Time
{
public:
	Time(int hour)
	{
		cout << "Time()" << endl;
	}
	Time(const Time&t)
	{
		cout << "Time(const Time&t)" << endl;
	}
	Time&operator=(const Time&t)
	{
		if (this != &t)
		{
			cout << "Time&operator=(const Time&t)" << endl;
			return *this;
		}
	}
private:
	int _hour;
};
class Date
{
public:
	/*Date(int year, int month , int day , const Time& t)
		:_year(year)
		, _month(month)
		, _day(day)
		, _t(t)

	{
		
		cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
	}*/
	Date(int year, int month, int day, const Time& t, const int& constdate,   int& a)
		:_t(t)//没有缺省构造函数的类成员变量
		,_constdate(constdate)
		, _a(a)//引用类型成员变量必须放初始化列表初始化

	{
		_year = year;
		_month = month;
		_day = day;
		_t = t;
		//:_constdate(constdate) 错误   const修饰的成员变量必须放初始化列表初始化
		cout << "Date(int year = 1900, int month = 1, int Day = 1, int hour = 0)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
	const int _constdate;
	int& _a;
};
int main()
{
	Time t(10);
	int a=2;
	Date d1(2017,1,9,t,4,a);
	system("pause");
	return 0;
}

三  成员变量按声明顺序依次初始化,而非初始化列表出现的顺序

#include<iostream>
using namespace std;
class Date
{
public:
	Date(int x)
		:_day(x)
		, _month(_day)
		, _year(_month)
	{
		cout << "Date(int x)" << endl;
	}
	void Display()
	{
		cout << "year  "<< _year << endl;
		cout << "month  "<< _year << endl;
		cout << "day  "<< _year << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(1);
	d1.Display();
	system("pause");
	return 0;
}
最后的最后再说一句,本篇讲述的是构造函数的初始化方式,拷贝构造也属于构造,因此是相同的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值