C++中的explicit关键字

简介:

先看一下MSDN上关于explicit关键字的解释

This keyword is a declaration specifier that can only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object.

1 该关键字只能用来修饰类内部的构造函数

复制代码
class A
{
public:
    explicit A(int i):m_i(i){};

private:
    int m_i ;
};
复制代码

但是下面这样就不对了

复制代码
class A
{
public:
    A(int i);

private:
    int m_i ;
};

explicit A::A(int i)
{
    m_i = i ;
}
复制代码

2 该关键字能防止隐式转换

在C++中允许这样的操作,某个类的构造函数只有一个参数,假设类型为T,那么可以进行T到该类的对象的隐式转换,比如下面的类A的构造函数只有一个参数,类型为int,那么就可以直接将一个int转换为A类的对象,这种情况可能发生在

  • 构造A类对象时
  • 以A的对象为参数的函数调用时
复制代码
class A
{
public:
    A(int i):m_i(i){};

private:
    int m_i ;
};

void Func(A a)
{
    
}

int main(void)
{
    A a1 = 1 ;    // OK, implicit convert 1 to object of A
    Func(2) ;    // OK, implicit convert 2 to object of A
    getchar() ;
}
复制代码

不幸的是,有时这种转换会造成混淆,所以我们要阻止这种转换,这就是explicit所做的事情了,用explicit声明的构造函数不允许做这种类型的转换。如果试图转换,则会遇到下面的编译错误。

复制代码
class A
{
public:
    explicit A(int i):m_i(i){};

private:
    int m_i ;
};

void Func(A a)
{
    
}

int main(void)
{
    A a1 = 1 ;    // error C2440: 'initializing' : cannot convert from 'int' to 'A'
    Func(2) ;    // 'Func' : cannot convert parameter 1 from 'int' to 'A'
    getchar() ;
}
复制代码

====


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2010/08/05/1792749.html,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 安全 算法
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
26 0
|
1月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
38 1
|
1月前
|
算法 安全 编译器
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
27 0
|
1月前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
25 0
|
1月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
33 0
|
1月前
|
存储 安全 编译器
【C++ 关键字 类型限定符 】揭秘C++编程中的神秘元素:深入了解volatile关键字的强大作用
【C++ 关键字 类型限定符 】揭秘C++编程中的神秘元素:深入了解volatile关键字的强大作用
21 0
|
15天前
|
编译器 C语言 C++
【C++】C++入门第一课(c++关键字 | 命名空间 | c++输入输出 | 缺省参数)
【C++】C++入门第一课(c++关键字 | 命名空间 | c++输入输出 | 缺省参数)
|
15天前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出
|
17天前
|
编译器 C语言 C++
【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例
【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例
|
30天前
|
存储 算法 编译器
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
28 0

热门文章

最新文章