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;
}
分享到:
相关推荐
C++ explicit关键字在刚学的时候就接触到了,也从各处了解了一些,但始终云里雾里,在闲来无事的时候再仔细研究了一下,自己消化理解了一下,自认为比其他网友总结的精简而不失准确。
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数如何参与类型转换。本文将详细解析`explicit`关键字的用途、意义以及它如何影响类对象的创建和赋值。 `explicit`关键字用于...
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它用于控制类的构造函数如何进行隐式类型转换。本文将深入探讨`explicit`构造函数的概念、作用以及如何避免潜在的编程错误。 首先,让我们理解什么是构造...
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数的行为,特别是涉及类型转换的情况。`explicit`关键字用来修饰单参数构造函数,目的是防止编译器进行隐式类型转换,从而避免...
C++中的显式构造函数(Explicit Constructors)是编程实践中一个重要的概念,主要用来控制类对象的隐式类型转换。在C++中,如果一个类有一个只接受一个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换...
C++中的拷贝构造函数和关键字explicit详解 C++中的拷贝构造函数是一种特殊的构造函数,它用于初始化对象时拷贝另一个对象的内容。拷贝构造函数的格式为`Type::Type(const Type&)`,其中`Type`是类的名称。拷贝构造...