东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

AG亚游最新客服

18820099307
联系方式
全国服务热线: 18820099307

咨询热线:18848572022
联系人:邓昊
地址:三郢路6号(东至路与洪岗路交口)

Effective C++学习笔记之explicit

来源:AG亚游最新客服   发布时间:2019-11-12   点击量:330

关键字:

  explicit意思为“明确的”和“清楚的”,是C++的关键词,意在阻止隐式类型的转换

 

使用原因:

  有时候不合法的隐式转换,会让乖巧听话的程序变得不可控。所以适当地使用explicit关键字是有必要的。

  如 string str = "a"; 这样的赋值是不能通过编译,错误原因是 invalid conversion from ‘char’ to ‘const char*,也就是“不能做隐式char->const char转换”。

 

注意事项:

  1、只能用于类内部构造函数的声明前,不能用于类外部构造函数的实现前;

  2、只能作用于构造函数的一个参数、或者有默认值的多个参数。

 

用途举栗:

  现有一个testDog的函数,函参是一个Dog类的对象。Dog类只提供了一个设置成员变量age的构造函数。

  1、传入name的构造函数,没有使用explicit关键字,直接对testDog传入一个string或者char *,也能得到想要的输出。其中隐式地将 "Huskie" 转换为一个“name  = Huskie,age = 0”的Dog类对象。

  2、传入age的构造函数,使用了explicit关键字,参数传入int型的2会编译不过,表示“不能做隐式int->Dog转换”。将Dog(2)当做函参传入就会解决此问题。

1 #include <iostream> 2 using namespace std; 3 4 class Dog 5 { 6 public: 7 string name; 8 int age; 9 10 explicit Dog(int age_)11 {12 name = "Huskie";13 age = age_;14 }15 Dog(const char* p)16 {17 name = p;18 age = 0;19 }20 };21 22 void testDog(Dog onedog)23 {24 cout<<"Dog"s name is :"<<onedog.name<<", age :"<<onedog.age<<endl;25 }26 27 int main()28 {29 string str = "a";//invalid conversion from ‘char’ to ‘const char*30 //即编译出错,不能做隐式char->const char转换31 32 Dog dog1 = 2;//编译出错,不能做隐式int->Dog转换33 Dog dog2 = "haha";34 35 cout<<"Test dog:"<<endl;36 testDog("Shiba Inu");37 testDog(2);//编译出错,不能做隐式int->Dog转换38 testDog(Dog(2));39 return 0;40 }

 

相关产品

COPYRIGHTS©2017 AG亚游最新客服 ALL RIGHTS RESERVED 备案号:330