构造函数与析构函数(3)

1)构造函数初始化列表

2)对象成员及其初始化

3)const成员、引用成员初始化

1)构造函数初始化列表

推荐在构造函数初始化列表中进行初始化。

构造函数的执行分为两个阶段

        初始化段

普通计算段

#ifndef _CLOCK_H_
#define _CLOCK_H_

class Clock
{
public:
	Clock(int hour = 0,int minute = 0, int second = 0);

	~Clock();
	void Display();
	void Init(int hour, int minute, int second);
	void Update();

	int GetHour();
	int GetMinute();
	int GetSecond();

	void SetHour(int hour);
	void SetMinute(int minute);
	void SetSecond(int second);


private:
	int hour_;
	int minute_;
	int second_;
};


#endif // !_CLOCK_H_
#include "Clock.h"
#include <iostream>

using namespace std;


void Clock::Display()
{
	cout << hour_ << ":" << minute_ << ":" << second_ << endl;

}

//推荐使用初始化列表对对象进行初始化,在构造函数内的是赋值操作,类似于int a;在赋值给a  = 10;
Clock::Clock(int hour, int minute, int second):hour_(hour),minute_(minute),second_(second)
{
	/*hour_ = hour;
	minute_ = minute;
	second_ = second;
	*/
	cout << "Clock::Clock" << endl;
}

/*void Clock::Init(int hour, int minute, int second)
{
	hour_ = hour;
	minute_ = minute;
	second_ = second;

}*/

Clock::~Clock()
{
	cout << "Clock::~Clock" << endl;
}

void Clock::Update()
{
	second_++;
	if (second_ == 60)
	{
		minute_++;
		second_ = 0;

	}
	if (minute_ == 60)
	{
		hour_++;
		minute_ = 0;
	}
	if (hour_ == 24)
	{
		hour_ = 0;
	}
}

int Clock::GetHour()
{
	return hour_;

}

int Clock::GetMinute()
{
	return minute_;
}

int Clock::GetSecond()
{
	return second_;
}

void Clock::SetHour(int hour)
{
	hour_ = hour;

}
void Clock::SetMinute(int minute)
{
	minute_ = minute;
}

void Clock::SetSecond(int second)
{
	second_ = second;
}





#include "Clock.h"

int main(void)
{
	Clock c(10,10,10);
	c.Display();

	return 0;
}

2)对象成员及其初始化

#include <iostream>

using namespace std;

//一般来讲将类的声明放在.h,类的实现放在.cpp这里为了方便实现,将在这里创建一个类。
class Object
{
public:
	Object(int num):num_(num)
	{
		cout << "Object..." << num_ << endl;

	}
	~Object()
	{
		cout << "~Oblect..." <<  num_<< endl;

	}

private:
	int num_;

};

class Container
{
public:
	Container(int obj1=0,int obj2=0):obj1_(obj1),obj2_(obj2)
	{
		cout << "Container..." << endl;

	}
	~Container()
	{
		cout << "~Container..." << endl;
	}
private:
	Object obj1_;
	Object obj2_;

};
int main(void)
{
	Container c(10,20); //实例化c,初始化值10,20

	return 0;
}

/*
输出:
Object...10     初始化obj1_,调用obj1_构造函数
Object...20		初始化obj2_,调用obj2_构造函数
Container...	调用c构造函数
~Container...	析构c
~Oblect...20	析构obj2_
~Oblect...10	析构obj1_
*/

3)const成员、引用成员初始化

#include <iostream>

using namespace std;

//一般来讲将类的声明放在.h,类的实现放在.cpp这里为了方便实现,将在这里创建一个类。
class Object
{
public:
	//要使常量对所有的对象有用
	enum E_TYPE
	{
		TYPE_A = 100,
		TYPE_B  = 200
	};
public:
	//const成员的初始化引用成员的初始化只能在构造函数初始化列表中进行
	//引用成员的初始化只能在构造函数初始化列表中进行
	//对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函数初始化列表中进行
	Object(int num = 0) :num_(num),kNum_(num),refNum_(num_) 
	{
		//kNum_ = 100;这里是赋值并不是初始化
		//refNum_ = num;
		cout << "Object..." << num_ << endl;

	}
	~Object()
	{
		cout << "~Oblect..." << num_ << endl;

	}
	void DisplayKNum()
	{
		cout << "kNum=" << kNum_ << endl;
	}
private:
	int num_;
	const int kNum_;
	int& refNum_;


};


int main(void)
{
	Object obj1(10);
	Object obj2(20);
	obj1.DisplayKNum();//输出:kNum=10  这里尽管定义的是const,但是对于不同的类,kNum_不同,要是对所有的类都是同一个常量,要用到枚举
	obj2.DisplayKNum();//输出:kNum = 20

	cout << obj1.TYPE_A << endl;
	cout << obj2.TYPE_B << endl;

	return 0;
}
/*

输出:
Object...10
Object...20
kNum=10
kNum=20
100
200
~Oblect...20
~Oblect...10
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值