博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关键字 explicit
阅读量:4135 次
发布时间:2019-05-25

本文共 1446 字,大约阅读时间需要 4 分钟。

 C++ 中 explicit 关键字的作用

    在 C++ 中, 如果一个类有只有一个参数的构造函数,C++ 允许一种特殊的声明类变量的方式。在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据转换为类的对象。 如果在构造函数前加上 explicit 修饰词, 则会禁止这种自动转换,在这种情况下, 即使将对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。

    下面以具体实例来说明。

class MyClass
{


    public:
    MyClass( int num );
}
   ....
MyClass obj = 10; //ok,convert int to MyClass

    在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:

    MyClass temp(10);

    MyClass obj = temp;

    上面的所有的操作即是所谓的"隐式转换".

    如果要避免这种自动转换的功能,我们该怎么做呢?嘿嘿这就是关键字explicit的作用了,将类的构造函数声明为"显示",也就是在声明构造函数的时候 前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显示的,那么下面的代码就不能够编 译通过了,如下所示:

class MyClass
{


   public:
   explicit MyClass( int num );
}
  ....
MyClass obj = 10; //err,can't non-explict convert

     c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以,一般约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为其他类的透明包装器的类。

  effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。

代码示例:

#include "stdafx.h"#include 
using namespace std;class Test1{ public: Test1(int n) { num = n; } //普通构造函数private: int num; };class Test2 {public: explicit Test2(int n) { num = n; } //explicit(显式)构造函数 private: int num; }; int main() { Test1 t1 = 12; //隐式调用其构造函数, 成功 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数 Test2 t3(12); //显示调用成功 return 0; }
        Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。

  普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

转载地址:http://tbsvi.baihongyu.com/

你可能感兴趣的文章
Query on a tree HDU - 3804(线段树求区间最大+树链剖分)
查看>>
Doom HDU - 5239(线段树+思维)
查看>>
Educational Codeforces Round 68 (Rated for Div. 2)(ABCD)
查看>>
Codeforces Round #535 (Div. 3)(ABCDE1E2)
查看>>
权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)
查看>>
Basketball Exercise CodeForces - 1195C(动态规划dp)
查看>>
Codeforces Global Round 4(ABCDE)
查看>>
subsequence 1(牛客多校第五场记忆化搜索+组合数学)
查看>>
Welfare State CodeForces - 1199D(线段树)
查看>>
linux下touch的运用以及在linux下创建可运行的.sh文件
查看>>
json和jsonp的使用格式
查看>>
Oracle密码过期,取消密码180天限制
查看>>
Linux下磁盘分区,格式化以及挂载
查看>>
Oracle创建用户并给用户授权查询指定表或视图的权限
查看>>
Linux下Oracle数据库自动备份Shell脚本
查看>>
Linux下oracle定时备份教程
查看>>
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
查看>>
Oracle报错,ORA-28001: 口令已经失效
查看>>
解决linux根目录磁盘空间满
查看>>
mysql报错ERROR 1054(42S22) Unknown column 'password' in ‘field list’
查看>>