Effective C++学习笔记之explicit

关键字:

  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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

你必须知道的指针基础-7.void指针与函数指针

  void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。

2272
来自专栏海天一树

小朋友学C++(8):继承

先编写程序: #include <iostream> using namespace std; class Animal { protected: fl...

26310
来自专栏Python小屋

Python多态原理与示例演示

所谓多态(polymorphism),是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。派生类继承了基类行为和属性之后,还会增加某些特定的行为和属性,...

3448
来自专栏程序员互动联盟

【java基础】Java extends用法详解

理解继承是理解面向对象程序设计的关键。在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Ja...

3768
来自专栏ImportSource

为什么实现了equals()就必须实现hashCode()?

我们先来看下面这个简单的例子,然后运行她: class Person{ private String name; private int age; ...

3904
来自专栏个人随笔

Java 面向对象三大特征之一: 多态

多态与类型转换 子类重写父类方法  1)位置:子类和父类中有同名的方法  2)方法名相同,返回类型和修饰符相同,参数列表相同        方法体不同 多态...

4029
来自专栏java学习

面试题61(关于继承多态的理解)

面试题61 2018年1月21日 ? 本期题目 (单选题)下列选项中哪一个是正确的? package Wangyi; class Base{ publi...

2965
来自专栏PHP在线

PHP数组操作

1.shuffle将数组打乱 <?php $my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse...

3657
来自专栏python3

python3--object类,继承与派生,super方法,钻石继承问题

{'kind': '波斯猫', 'name': '小黑', 'sex': '公'}

2881
来自专栏xingoo, 一个梦想做发明家的程序员

【设计模式】—— 解释器模式Interpret

  模式意图   自定义某种语言后,给定一种文法标准,定义解释器,进行解析。   做过搜索的朋友们可能更了解一些,平时我们搜索所需要的词库,通常就需要用这种方...

2126

扫码关注云+社区

领取腾讯云代金券