C++入门学习——explicit关键字的作用

C++ 语言可以定义如何将其他类型的对象隐式转换为我们的类类型, 或将我们的类类型的对象隐式转换为其他类型。

下面为类类型的隐式转换的示例代码:

#include <iostream>
using namespace std;

class A
{
public:
	A(int temp) //普通构造函数
	{
		a = temp;
		cout << "普通构造函数: a= " << a << endl;
	}

	A(const A &temp) //拷贝构造函数
	{
		a = temp.a;
		cout << "拷贝构造函数: a = " << a << endl;
	}

private:
	int a;
};

int main()
{
	cout << "显示调用:" << endl;
	A a(250); //显式调用调用普通构造函数,ok
	A b(a);   //显式调用调用拷贝构造函数,ok

	cout << "\n隐式转换:" << endl;
	A c=222; //隐式转换成调用普通构造函数,ok
	A d=c;   //隐式转换成调用拷贝构造函数,ok

	return 0;
}

编译运行结果如下:

如果要避免这种自动转换的功能,我们该怎么做呢?C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生

c++中的explicit关键字抑制由构造函数定义的隐式转换。explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不要加explicit关键字。

示例代码如下:

#include <iostream>
using namespace std;

class A
{
public:
	explicit A(int temp) //普通构造函数,被声明为explicit(显式)
	{
		a = temp;
		cout << "普通构造函数: a= " << a << endl;
	}

	explicit A(const A &temp) //拷贝构造函数,被声明为explicit(显式)
	{
		a = temp.a;
		cout << "拷贝构造函数: a = " << a << endl;
	}

private:
	int a;
};

int main()
{
	cout << "显示调用:" << endl;
	A a(250); //显式调用调用普通构造函数,ok
	A b(a);   //显式调用调用拷贝构造函数,ok

	//explicit构造函数只能被显式调用
	A c=222; //不能通过隐式转换,error
	A d=c;   //不能通过隐式转换,error

	return 0;
}

编译时会报错:

普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。

通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为 explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。

本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

时间: 2024-10-29 03:34:35

C++入门学习——explicit关键字的作用的相关文章

C++中explicit关键字的作用

转自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things{ public: things(const std::string&name =""): m_name(name),height(0),weight(

c++的explicit关键字的作用

关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象. 这样看起来好象很酷,

Egg入门学习(三)---理解中间件作用

Egg是基于koa的,因此Egg的中间件和Koa的中间件是类似的.都是基于洋葱圈模型的. 在Egg中,比如我想禁用某些IP地址来访问我们的网页的时候,在egg.js中我们可以使用中间件来实现这个功能,中间件的作用无非就是说在Egg的外层在包一层来判断某些事情是否符合要求,也就是在洋葱圈模型外面再进行包一层.在Egg入门二学习中(https://www.cnblogs.com/tugenhua0707/p/10226799.html), 我们最后的项目的目录结构如下: egg-demo2 ├──

&lt;转&gt;C++ explicit关键字详解

要文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用explicit关键字的类声明, 即默

C++ explicit关键字详解

本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString  // 没有使用explicit关键字的

深入理解C++中的explicit关键字

深入理解C++中的explicit关键字 [email protected] http://blog.csdn.net/kezunhai C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 关于explicit关键字,先看看MSDN上的解释: This keyword is a declaration speci

(转载)OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性,今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了 二.关键字@class的作用 在来看一下OC中的关键字@class的作用,在

OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化