`

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 Constructors(显式构造函数)

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

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

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

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

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

    C++中explicit作用示例代码

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制构造函数的隐式类型转换。本文将深入探讨`explicit`的作用,并通过示例代码帮助理解其工作原理。 `explicit`关键字用于声明单参数构造函数...

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

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

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

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

    认识 C++ 中的explicit 关键字

    在C++编程语言中,`explicit`关键字是一个非常重要的修饰符,它用于构造函数,用于控制类型转换的行为。本文将深入探讨`explicit`关键字的作用、使用场景以及它如何帮助避免潜在的错误。 首先,让我们来看一下`...

    More Effective C++中文版

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

    高效C++中级编程教程

    新引入的关键字,如`const_cast`、`dynamic_cast`、`explicit`等,增强了类型转换的安全性和灵活性。`friend`、`mutable`、`namespace`和`operator`等则扩展了类的访问控制和操作符重载的功能。`new`和`delete`管理...

    C++中的Explicit关键字

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

    C++11最新使用手册

    - **5.4 Explicit type conversion (cast notation) 显式类型转换 (类型转换语法)**:说明了如何显式地改变表达式的类型。 - **5.5 Pointer-to-member operators 成员指针运算符**:介绍了成员指针运算符的使用...

    C++和QML交互

    explicit ColorMaker(QObject *parent = nullptr) : QObject(parent) {} ~ColorMaker() {} signals: void colorChanged(const QColor &color); void currentTime(const QString &strTime); public slots: ...

    QML 与 C++交互 - 02 C++暴露方法到QML

    explicit MyClass(QObject *parent = nullptr) : QObject(parent) {} // 在这里声明要暴露给QML的方法 Q_INVOKABLE void myMethod() { // 方法的具体实现 } // 如果需要传递参数,可以定义这样的方法 Q_...

    Qt Qml实例分析—QML调用C++方法, C++调用QML

    explicit MyComponent(QObject *parent = nullptr) : QObject(parent) {} void myCppMethod() { // 实现C++方法 } }; ``` 然后在QML中,可以通过`Component.onCompleted`或`Connections`元素来调用这个方法: ...

Global site tag (gtag.js) - Google Analytics