`

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`关键字是一个非常重要的特性,它主要用于控制类的构造函数如何参与类型转换。本文将详细解析`explicit`关键字的用途、意义以及它如何影响类对象的创建和赋值。 `explicit`关键字用于...

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

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它用于控制类的构造函数如何进行隐式类型转换。本文将深入探讨`explicit`构造函数的概念、作用以及如何避免潜在的编程错误。 首先,让我们理解什么是构造...

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

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数的行为,特别是涉及类型转换的情况。`explicit`关键字用来修饰单参数构造函数,目的是防止编译器进行隐式类型转换,从而避免...

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

    C++中的显式构造函数(Explicit Constructors)是编程实践中一个重要的概念,主要用来控制类对象的隐式类型转换。在C++中,如果一个类有一个只接受一个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换...

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

    C++中的拷贝构造函数和关键字explicit详解 C++中的拷贝构造函数是一种特殊的构造函数,它用于初始化对象时拷贝另一个对象的内容。拷贝构造函数的格式为`Type::Type(const Type&)`,其中`Type`是类的名称。拷贝构造...

Global site tag (gtag.js) - Google Analytics