• 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 }
  • 相关阅读:
    Head First HTML与CSS阅读笔记(一)
    Redis安装配置及在Python上的应用
    PXE+Kickstack实现无人值守安装CentOS 7操作系统(附一台CentOS7实现CentOS6和CentOS7双系统安装)
    Linux常用命令之diff使用介绍
    渗透测试专业术语
    CentOS7之SVN服务配置
    Linux下面误删除文件使用extundelete工具恢复介绍
    Linux单元测试题一
    Linux下面MariaDB 管理命令基础使用
    Linux中/etc下面passwd和shadow文件介绍
  • 原文地址:https://www.cnblogs.com/Christal-R/p/9510638.html
Copyright © 2020-2023  润新知