C++ 隐式类型转换与关键字explicit

1.什么是类型转换

某些类型之间存在相关的依赖关系,在须要某种类型的操做数位置上,使用该类型的相关类型的值或对象.

2.什么是隐式类型转换

转换规则由编译器自动执行,无需程序员介入

3.什么时候产生隐式类型转换

1)在混合类型的表达式中,其操做数转换为相同的类型.
(操做符的两边)
int ival;
int dval;
ival>=dval

2)用做条件表达式被转换成bool类型.
int ival=3;
if(ival)
;

3)用一表达式初始化某个变量或将以表达式赋值给某个变量,则该表达式被转换为该变量的类型.
(操做符的两边)
int val=3.14;//将3.14强制转换成int类型
int *p=0;//将int 0转换为int指针的空指针.

4)函数调用时产生的隐式类型转换
形参与实参
实参的类型与其对应的形参类型匹配:实参必须有与形参类型相同或者能隐式转换为形参类型的数据类型
(顺便备注一句:函数重载肯定,即函数匹配,以前在写一个封装打印输出函数时,曾出现错误,std::string char*类型中有个出错了,如今想一想仍是对函数重载概念不够清晰)

4.为何扯这些.

只看explicit关键字,说的很简单,可是本身看过两三次,看primer,老是感受有些东西不够透.但若是深究缘由的其实很简单,explicit就是关于类类型隐式转换的关键字.什么时候产生,产生的原理何在,就是上面所描述隐式类型转换方面的东西.
东西要联系起来看,每一个都不是孤立的.知其然,知其因此然.

5.explicit 关键字

1.产生类类型隐式转换条件

单个形参来调用构造函数定义了从形参类型到该类类型的一个隐式转换.
若是没有单个形参,或者单个形参加explicit关键字,在3中描述产生隐式转换状况,根本不会进行隐式转换.反之,当处于3中描述的情形中,就会产生隐式类类型转换.

2.怎样使用explicit

构造函数声明为explicit,来防止在须要隐式转换的地方使用构造函数.定义时则不须要再加入explicit.
Boost timer类中,只有一个参数的构造函数使用了explicit,含有两个参数即以上的构造函数,没有加入explicit.

3.类类型隐式转换过程

class Sales_item  
{  
public:   
    Sales_item(const std::string & book);  
    Sales_item(std::istream & is);  
};  
  
bool same_isbn(Sales_item book)  
{  
}  
  
std::string null_book = "9-999-99999-9";  
item.same_isbn(null_book);  
item.same_isbn(cin);

单参数的构造函数使类类型隐式转换有了可能.
在same_isbn函数中须要Sales_item类型.可是因为有了string单个参数构造函数,null_book会隐式转换成类型Sales_item.如何转换?
item.same_isbn(null_book); 
实质上等于
item.same_isbn(Sales_item(null_book));
cin也是同样.

6.关于explicit 一个小结.

       C++ Primer中提到:一般,除非有明显的理由想要定义隐式转换,不然,但形参构造函数应该为explicit。将构造函数设置为explicit能够避免错误,并且当转换有用时,用户能够显式地构造对象。
       
c++

       google的c++规范中提到:explicit的优势是能够避免不合时宜的类型变换,缺点无。因此google约定全部单参数的构造函数都必须是显示的,只有极少数状况下拷贝构造函数能够不声明称explicit。例如做为其余类的透明包装器的类。程序员

       effective c++中提到:被声明为explicit的构造函数一般比其non-explicit兄弟更受欢迎。由于它们禁止编译器执行非预期(每每也不被指望)的类型 转换。除非我有一个好理由容许构造函数被用于隐式类型转换,不然我会把它声明为explicit。我鼓励你遵循相同的政策。函数



另一篇比较不错的博客:google

http://blog.csdn.net/shuangshuang37278752/article/details/14143093
spa