C++11 新特性 之 explicit关键字 - 显示构造与隐式构造

前言

explicit关键字,是C++11新标准出现的一个关键字

explicit的作用是表明该构造函数是显示的, 而非隐式的.不能进行隐式转换! 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).


例子

现在我们使用的C++编译器大多都是C++11之上的版本了,所以我们在写构造函数时,如果没有写前缀,那么编译器会默认在构造函数的前面写上一个implicit,表名这个类是可以使用隐式构造的。

例如:
新建一个Student类,里面由私有变量int age; 和 string name;
两个构造函数,Student(int _age) 和 tudent(int _age, string _name)
如下代码:

class Student {

public:
	// 没有添加前缀,编译时,编译器会默认在前面添加implicit修饰
	Student(int _age) {
		this->age = _age;
		cout << "age = " << this->age << endl;
	};

	Student(int _age, string _name) {
		this->age = _age;
		this->name = _name;
		cout << "age = " << this->age << "\tname = " << this->name << endl;
	}

private:
	int age;
	string name;
};

定义好之后,在main函数中声明对象:

int main(void) {
	Student S1(22);		// 显示构造
	Student S2 = 23;	// 隐式构造

	Student S3(24, "S3");		// 显示构造
	Student S4 = { 25, "S4" };	// 隐式构造,初始化参数列表,C++11之前的版本不能通过,C++11新特性

	return 0;
}

可以看到,S1和S3使用的是显示构造,而S2和S4使用的是隐式构造,那么问题来了,这样着,语法正确吗?真的可以编译通过吗?

带着疑问,我们编译一下看结果:
C++11 新特性 之 explicit关键字 - 显示构造与隐式构造_第1张图片
可以看出,不但可以编译通过,而且还可以正常运行!说明这种写法是可行了。

有朋友会有疑问,implicit是什么,是关键字吗?
NO,NO,它不是关键字,只能说编译器的一种修饰,我们不可以自己写上,只能让编译器自己加上。
那要是我们非要写上呢?可以写上去看看效果。
C++11 新特性 之 explicit关键字 - 显示构造与隐式构造_第2张图片
可以看到,提示implicit不是一个关键字,所以这个单词我们不可以自己使用,只能编译器自己使用。所以去掉它就可以正常运行了。

这时,肯定会有朋友会又会懵逼,为什么使用隐式构造都可以编译通过?
没错,刚才是接触时,我也挺懵逼的,以前没有接触过这种写法,看起来好像是赋值操作,很歧义。

经过了解,发现这是C++11标准的用法,这是C++11新加的功能。
他就是可以使用赋值的方式进行构造对象,而且多个参数也是一样可以进行构造;就是要使用大括号括起来,也就是参数列表。

所以呢?如果我们不希望程序员使用隐式构造,该如何禁用他呢?
这时,explicit关键字关键字诞生了,他的诞生就是为了阻止隐式构造。

使用方法:
直接在构造函数前写上这个关键字进行修饰即可!
C++11 新特性 之 explicit关键字 - 显示构造与隐式构造_第3张图片

由图可以看出,当我们使用explicit进行修饰构造函数后,他的隐式调用代码立即就报错了,使用explicit关键字,确实是可以禁止隐式构造。

所以,当我们不希望别人声明对象时使用隐式构造,就可以使用这个关键字进行修饰!


全部代码:

#include 
#include 
#include 
#include 

using namespace std;


class Student {

public:
	// explicit
	Student(int _age) {
		this->age = _age;
		cout << "age = " << this->age << endl;
	};

	Student(int _age, string _name) {
		this->age = _age;
		this->name = _name;
		cout << "age = " << this->age << "\tname = " << this->name << endl;
	}

private:
	int age;
	string name;
};


int main(void) {
	Student S1(22);		// 显示构造
	Student S2 = 23;	// 隐式构造

	Student S3(24, "S3");		// 显示构造
	
	// 隐式构造,初始化参数列表,C++11之前的版本不能通过,C++11新特性
	Student S4 = { 25, "S4" };	

	return 0;
}

总结

虽然不怎么常见这种用法,但是今天我们学习了它,当下次我们遇到它时就不会懵逼了,知道它是怎么使用的,怎么去禁用它。
当然,项目开发中,不建议使用隐式构造

你可能感兴趣的:(c++,c++,超星计划)