前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Effective C++学习笔记之explicit

Effective C++学习笔记之explicit

作者头像
Christal_R
发布2018-08-28 15:37:04
4740
发布2018-08-28 15:37:04
举报

关键字:

  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)当做函参传入就会解决此问题。

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键字:
  • 使用原因:
  • 注意事项:
  • 用途举栗:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档