转换分配C++ explicit关键字

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,码代几天不写就忘。目前又不当COO,还是得用心记码代哦!

    在C++ primer 4th的第394讲解了explicit这个关键字,面上就是我的学习心得。

    按照认默定规,只有一个参数的构造数函也定义了一个隐式转换,将该构造数函对应数据类型的数据转换为该类象对,如面上所示:

    

  1. class MyClass  
  2. {  
  3. public:  
  4. MyClass( int num );  
  5. }  
  6. //.  
  7. MyClass obj = 10; //ok,convert int to MyClass 

    

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

  1. MyClass temp(10);  
  2. MyClass obj = temp

    

面上的有所的C++ explicit关键字相干的作操等于所谓的"隐式转换"。

    

    

    

但是有的时候可能会不需要种这隐式转换,如下:

    

class String {

    

       String ( int n ); //本意是事后分配n个节字给字符串

    

       String ( const char* p );  // 用C风格的字符串p作为初始化值

    

//…

    

}

    

 

    

面上两种写法较比常正:

    

String s2 ( 10 );   //OK 分配10个节字的空字符串                 直接调用数函

    

String s3 = String ( 10 ); //OK 分配10个节字的空字符串     直接调用数函

    

 

    

面上两种写法就较比惑疑了:

    

String s4 = 10; //编译通过,也是分配10个节字的空字符串     隐式转换:String temp=String(10);  String sv=temp
    每日一道理
如果你们是蓝天,我愿做衬托的白云;如果你们是鲜花,我愿做陪伴的小草;如果你们是大树,我愿做点缀的绿叶……我真诚地希望我能成为你生活中一个欢乐的音符,为你的每一分钟带去祝福。

    

String s5 = ‘a’; //编译通过,分配int(‘a’)个节字的空字符串   隐式转换:String temp=String('a');  String sv=temp

    

 

    

s4 和s5 分别把一个int型和char型,隐式转换成了分配干若节字的空字符串,轻易人令误会。

    

为了避免种这错误的生发,我们可以声明表现的转换,应用 explicit 关键字:

    

class String {

    

                    explicit String ( int n ); //本意是事后分配n个节字给字符串

    

                  String ( const char* p );  // 用C风格的字符串p作为初始化值

    

//…

    

}

    

加上 explicit,就克制了String ( int n )的隐式转换,

    

 

    

面上两种写法仍然准确:

    

String s2 ( 10 );   //OK 分配10个节字的空字符串

    

String s3 = String ( 10 ); //OK 分配10个节字的空字符串

    

 

    

面上两种写法就不许允了:

    

String s4 = 10; //编译不通过,不许允隐式的转换

    

String s5 = ‘a’; //编译不通过,不许允隐式的转换

    

 

    

因此,某些时候, explicit 可以效有得避免构造数函的隐式转换带来的错误或者误会

    

    

    参考文献:http://www.360doc.com/content/13/0508/15/12269514_283890361.shtml   

                 http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html

    

文章结束给大家分享下程序员的一些笑话语录: 姿势要丰富,经常上百度!

posted @ 2013-05-08 20:34  xinyuyuanm  阅读(172)  评论(0编辑  收藏  举报