C++语法学习笔记九: 构造函数详解、explicit、初始化列表

实例代码:


#include 
#include 
#include 

using namespace std;

class Time {

private:
	void initMillTime(int mls) {
		Millisecond = mls; 
	}

	int Millisecond; //毫秒
public:
	int Hour; //小时
	int Minute;//分钟
	int Second;//秒钟


	//构造函数
	Time(int temphour, int tmpmin, int tmpsec) {
		Hour = temphour;
		Minute = tmpmin;
		Second = tmpsec;
		initMillTime(0);

		cout << "调用了构造函数Time(int temphour, int tmpmin, int tmpsec)" << endl;
	}

	Time() {
		Hour = 12;
		Minute = 59;
		Second = 59;
		initMillTime(50);

		cout << "调用了构造函数Time()" << endl;
	}


	Time(int temphour) {
		Hour = temphour;
		Minute = 59;
		Second = 59;
		initMillTime(50);

		cout << "调用了构造函数Time(int temphour)" << endl;
	}

	explicit Time(int temphour, int tmpmin) {
		Hour = temphour;
		Minute = tmpmin;
		Second = 59;
		initMillTime(50);

		cout << "调用了构造函数Time(int temphour, int tmpmin)" << endl;
	}


	Time(int temphour, int tmpmin, int tmpsec, int tmpmill) 
		: Hour(temphour), Minute(tmpmin), Second(tmpsec), Millisecond(tmpmill) { //构造函数初始化列表

		cout << "调用了构造函数Time(int temphour, int tmpmin, int tmpsec, int tmpmill)" << endl;
	}
};






int main() {

	//Time myTime
	//一: 构造函数
	//在类中,有一个特殊的成员函数,它的名字和类名相同,我们在创建类对象的时候,这个特殊的成员函数就会被系统自动调用。
	//这个成员函数,就叫“构造函数”,因为构造函数会被系统自动调用,所以我们可以简单的理解成:构造函数的目的就是初始化类对象的数据成员。
	//(1) 构造函数没有返回值。这也是够着函数的特殊之处。
	//(2) 不可以手工调用构造函数,否则编译就会出错。
	//(3) 正常情况下,构造函数应该被声明为public,因为我们创建一个对象时,系统要替我们调用构造函数,所以必须说明构造函数是一个public函数,
	//否则就无法直接创建该类的对象。

	//(4) 构造函数中如果有多个参数,则我们创建对象的时候也要带上这些参数
	Time myTime = Time(12, 13, 52);//创建类对象
	Time myTime2(12, 13, 52); 
	Time myTime3 = Time{ 12, 13, 52 };
	Time myTime4{ 12, 13, 52 };
	Time myTime5 = { 12, 13, 52 };

	//二: 多个构造函数
	//一个类中可以有多个构造函数,就可以为类对象的创建提供多种初始化方法。但是多个构造函数之间总要有点不同的地方,要么参数类型不同,要么参数数量不同。
	Time myTime11 = Time();//创建类对象
	Time myTime12; //Time myTime12();
	Time myTime13 = Time{};
	Time myTime14{};
	Time myTime15 = {};

	//对象拷贝
	Time myTime20;//可以调用构造函数
	//如下4个对象并没有调用传统意义上的构造函数,而是调用了拷贝构造函数
	Time myTime22 = myTime20;
	Time myTime23(myTime20);
	Time myTime24{ myTime20 };
	Time myTime25 = { myTime20 };

	//三:函数默认参数
	//规定:
	//(1) 默认值只能放在函数声明中,除非该函数没有函数声明。
	//(2) 在具有多个参数的函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,它右边的所有参数必须指定默认值


	//四:隐式转换和explicit
	//编译系统,在私下干了很多我们所不知道和不了解的事
	Time myTime40 = 14;  // 调用了构造函数 Time(int temphour)   编译系统肯定有个行为,把14这个数字再转换成了一个Time类型
	Time myTime41 = (12, 13, 14, 15);// 调用了构造函数 Time(int temphour)

	Time myTime50 = { 16 };//这个写法我们认为正常,带一个参数16,可以让系统明确的知道调用哪个构造函数
	Time myTime51 = 16; //含糊不清的写法,就存在临时对象隐式转换

	//是否可以强制系统,明确要求构造函数不能做隐式类型转换呢?
	//可以,如果构造函数声明中带有explicit,则这个构造函数只能用于初始化和显示类型转换
	Time myTime51 = Time(12, 13);//创建类对象
	Time myTime52(12, 13);
	Time myTime53 = Time{ 12, 13 };
	Time myTime54{ 12, 13 };
	// Time myTime55 = { 12, 13 }; //报错 因为 构造函数 explicit声明 这里不能进行隐式类型转换  -- 复制列表初始化


	//对于单参数的构造函数,一般都声明为explicit,除非你有特别原因(这句很重要)。


	//五:构造函数初始化列表 (提倡使用这种方式)
	//(1) 显得专业
	//(2) 效率更高
	Time myTime = Time(12, 13, 52, 0);


	system("pause");
	return 0;
}

你可能感兴趣的:(#,3.2,C++)