`

C++ explicit

阅读更多
C++ explicit用来修饰构造函数,表明是显式的。与显式对应的就是隐式的,没有加explicit
修饰。隐式构造函数是可以发生隐式转换的(一个参数,或者多个参数中只有一个参数没有默认值)。
class Day{
public:
 Day(int day):m_day(day){}
private:
 int m_day;
};

Day a = 20;//ok,调用隐式Day(int day)隐式转换.

有时候我们不希望进行类型转换,因为自动类型转换,会丢失编译期的类型检查。
举个例子:
class Year{
public:
	Year(int year):m_year(year){
	}
private:
	int m_year;
};

class Month{
public:
	Month(int month): m_month(month){
	}
private:
	int m_month;
};

class Day{
public:
	Day(int day):m_day(day){
	}
private:
	int m_day;
};

class Date
{
public:
	Date(const Year &year, const Month &month, const Day& day):m_year(year),m_month(month),m_day(day){
		std::cout << "Date(const Year &, const Month &,const Day &)" << std::endl;
	}
	  ~Date(void){};
private:
	Year m_year;
	Month m_month;
	Day m_day;
};

int main(){
	Date date(30,3,1985);//is ok,but the argument order is wrong
	return 0;
}


我们看到Date date(30,3,1985);隐式转换失去编译器的类型检查,导致接口被误用。
所以要是我们的接口更容易使用,就需要在Year,Moth,Day的构造函数上面加上
explicit关键字。
class Year{
public:
	explicit Year(int year):m_year(year){
	}
private:
	int m_year;
};

class Month{ 
public:
	explicit Month(int month): m_month(month){
	}
private:
	int m_month;
};

class Day{
public:
	explicit Day(int day):m_day(day){
	}
private:
	int m_day; 
};

class Date
{
public:
	Date(const Year &year, const Month &month, const Day& day):m_year(year),m_month(month),m_day(day){
		std::cout << "Date(const Year &, const Month &,const Day &)" << std::endl;
	}
	  ~Date(void){};
private:
	Year m_year;
	Month m_month;
	Day m_day;
};

int main(){
	Date date(30,3,1985);//compile error
         Date date(Year(1985),Month(3),Day(30));//ok
	return 0;
}

0
0
分享到:
评论

相关推荐

    C++ explicit通俗解释

    C++ explicit关键字在刚学的时候就接触到了,也从各处了解了一些,但始终云里雾里,在闲来无事的时候再仔细研究了一下,自己消化理解了一下,自认为比其他网友总结的精简而不失准确。

    C++ Explicit关键字详细解析

    以下是对C++中Explicit关键字的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    浅谈C++ Explicit Constructors(显式构造函数)

    下面小编就为大家带来一篇浅谈C++ Explicit Constructors(显式构造函数)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    C++ explicit构造函数实例解析

    主要介绍了C++ explicit构造函数,需要的朋友可以参考下

    C++ explicit关键字的应用方法详细讲解

    我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字。下面就让我们一起来看看这方面的知识吧。 C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有”显式”那么必然就...

    C++中explicit作用示例代码

    C++入门学习——explicit关键字的作用,相关教程链接如下:http://blog.csdn.net/tennysonsky/article/details/49096977

    C++中的explicit关键字实例浅析

    在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上,再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。接下来给大家介绍 C++中的explicit关键字,需要的朋友可以参考...

    c/c++拷贝构造函数和关键字explicit详解

    主要介绍了c/c++拷贝构造函数和关键字explicit的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    c++,隐式转换及explicit简单介绍

    c++,隐式转换及explicit简单介绍,个人(新人)分享,有误请勿喷。

    C++中的Explicit关键字

    在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下会发现现有的MFC库或者C++标准库中的相关类...

    More Effective C++中文版

    一些经过验证的用来改善程序效率的方法,包括检验C++... 介绍新的语言特性,包括bool、mutable、explicit、namespaces、成员模板、标准模板库等。如果你的编译器不支持这些特性,本书还介绍了如何不利用它们完成工作。

    认识 C++ 中的explicit 关键字

    带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:   class MyClass{ public: MyClass(int nParam);// 带一个参数的构造函数 ... //////////////////////////////

    深度探索C++对象模型2012版.rar

    作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。 本书专注...

    深入探索C++对象模型-总结笔记.pdf

    作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。 本书专注于...

    more effective c++

    一些经过验证的用来改善程序效率的方法,包括检验C++..., 介绍新的语言特性,包括bool、mutable、explicit、namespaces、成员模板、标准模板库等。如果你的编译器不支持这些特性,本书还介绍了如何不利用它们完成工作。

Global site tag (gtag.js) - Google Analytics