现在的位置: 首页 > 综合 > 正文

c++中的explicit关键字

2017年11月12日 ⁄ 综合 ⁄ 共 2228字 ⁄ 字号 评论关闭

转自:http://www.azure.com.cn/article.asp?id=335

 

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?

如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

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
 
 
以下from:CSDN论坛

explicit  
  C++   Specific    
   
  This   keyword   is   a   declaration   specifier   that   can   only   be   applied   to   in-class   constructor   declarations.   Constructors   declared   explicit   will   not   be   considered   for   implicit   conversions.   For   example:  
   
  class   X   {  
  public:  
        explicit   X(int);             //legal  
        explicit   X(double)   {       //legal  
              //   ...  
        }  
  };  
   
  explicit   X::X(int)   {}             //illegal  
  An   explicit   constructor   cannot   take   part   in   implicit   conversions.   It   can   only   be   used   to   explicitly   construct   an   object.   For   example,   with   the   class   declared   above:  
   
  void   f(X)   {}  
  void   g(int   I)   {  
        f(i);             //   will   cause   error  
  }  
  void   h()   {  
        X   x1(1);             //   legal  
  }  
  The   function   call   f(i)   fails   because   there   is   no   available   implicit   conversion   from   int   to   X.  
   
  Note       It   is   meaningless   to   apply   explicit   to   constructors   with   multiple   arguments,   since   such   constructors   cannot   take   part   in   implicit   conversions.  
   
  END   C++   Specific  

explicit主要用于"修饰"构造函数.  
  使得它不用于程序中需要通过此构造函数进行"隐式"转换的情况!  
   
  指定此关键字,需要隐式转换方可进行的程序将会不能通过.  
  而可通过强制转换使它没有用.  

explicit,和构造函数一起使用.  
  explicit   constructor指明构造函数只能显示使用,目的是为了防止不必要的隐式转化.  
  举个例子:  
      有这样一段代码:  
   
  class   A  
  {  
        public:  
            A(int);  
        private:  
            int   num;  
  };  
   
  int   Test(const   A&)   //   一个应用函数  
  {  
        ...  
  }  
   
  Test(2);   //   正确  
  过程是这样的:   编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:  
      const   A   temp(2);             //   从2产生一个临时A对象  
      Test(temp);           //   调用函数  
   
   
  如果代码写成如下样子:  
  class   A  
  {  
        public:  
          explicit   A(int);  
        private:  
            int   num;  
  };  
   
  int   Test(const   A&)   //   一个应用函数  
  {  
        ...  
  }  
   
  Test(2);   //   失败,不能通过隐式类型转换将int类型变量构造成成A类型变量  

抱歉!评论已关闭.