码迷,mamicode.com
首页 > 编程语言 > 详细

C++中 explicit的用法

时间:2015-03-04 14:47:06      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

在C++中,explicit关键字主要用于防止隐式转换(避免构造函数的参数自动转换为类对象的标识符),用于修饰构造函数、复制构造函数。

例如有一个类:

技术分享
class A 
{ 
public: 
    A( int count ) : m_data( count ){} 
private: 
    int m_data; 
};

int main() 
{ 
    A a = 0;  //ok , conver int to A 

    a = 10; // 这里是什么操作?  等价与 a.operator=( 10 );
} 
技术分享

1、 A a = 0;

首先编译器( compiler )认为这样写是不符合规矩的,因为 A = A才是正常行为但是它不放弃,通过搜索发现A可以根据一个int构造,同时这个A( int count)没有用explicit修饰过。那么A a=0编译器将自动将整形转为A类对象,实际上等同下面操作

A temp( 0);

A a = temp;

这里需要说明的是 A a = tmp 调用的是拷贝构造函数( copy constructor),虽然clas A中没有,但是通常不写的话,编译器会生成一个成员逐一赋值( memberwise assignment )的拷贝构造函数,底层实现通常会以memcpy进行

 

2、a = 10;

首先这里同构造函数一样,编译器( compiler ) 无法进行直接操作,等同于代码

a.operator=( 10 );

需要注意的是, a = tmp是调用的赋值运算符( assignment操作 ), 同构造函数一样,我们自己不写, 编译器会生成一个成员逐一赋值(memberwise assignment)操作。

 

3、fun( A a )

同样, fn(10)也是不对的, 但是"按照惯例", 会有: 
A tmp(10); 
fn( tmp ) ;

 

注意拷贝构造函数的写法只能是 T::T(const T &);

而赋值运算符的写法可以多变,即以任意T为例:

可以有

T &operator = (int n); 
也可有 
T &operator = (const char *);

当然, 你要确认如此的定义是对T而言有意义.

  1. #include <iostream>  
  2. using namespace  std;  
  3.   
  4. class A  
  5. {  
  6. public:  
  7.   
  8.      explicit A(int a)  
  9.     {  
  10.         cout<<"创建类成功了!"<<endl;  
  11.   
  12.       
  13.     }  
  14.       
  15.       
  16.   
  17. };  
  18. int main()  
  19. {  
  20.   
  21.     A a=10;  
  22.     return 0;  
  23. }  

 

上面的代码编译不成功,原因是当显式地定义了一个带一个参数的构造函数( 带explicit),必须要显示地调用构造函数,

A a(10);

如果不加 explicit的话

A a=10;

实际的转换过程如下:
相当于直接调用A(10);

(1)

explicit

此关键字只能对用户自己定义的对象起作用,不对默认构造函数起作用
此关键字只能够修饰构造函数。而且构造函数的参数只能有一个。。

(2)何时用explicit

当我们不希望自动类型转换的时候用,其实标准库好多构造函数都是explicit的

比如说vector <int> ivec(10);  //这种定义看起来一目了然

不能写成vector <int> ivec=10;//此种定义让程序员感到疑惑

(3)何时不用explicit

当我们需要隐式转换的时候

比如说String类的一个构造函数

String(const char*);

 

定义成这样的好处,在需要隐式转化的时候编译器会自动地帮我们转换,标准库里面的String就是一个好的证明。

具体来说:

 

我们可以这样String str="helloworld";//直接调用构造函数

 

String str="hello"+str+"world";

 

调用重载的+操作符号,此过程相当于:
String temp("hello"); //调用构造函数

String str=temp+str;

String t("world");//调用构造函数

String str=str+t;

 

 

明白隐式转换在我们自己写类的时候,尤其是些操纵内存的类的时候很有用。

C++中 explicit的用法

标签:

原文地址:http://blog.csdn.net/u014082714/article/details/44058849

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!