zoukankan      html  css  js  c++  java
  • C++中explicit关键字的使用(转)

    看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅。

    在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。

    注意:只有一个参数的构造函数,或者构造函数有n个参数,但有n-1个参数提供了默认值,这样的情况才能进行类型转换。

    下面通过一段代码演示具体应用(无explicit情形):

    复制代码
     1 /* 示例代码1 */
     2 class Demo
     3 {
     4    public:
     5     Demo();                     /* 构造函数1 */
     6     Demo(double a);              /* 示例代码2 */
     7     Demo(int a,double b);           /* 示例代码3 */
     8     Demo(int a,int b=10,double c=1.6);  /* 示例代码4 */
     9     ~Demo();
    10     void Func(void);
    11 
    12     private:
    13     int value1;
    14     int value2;
    15 };
    复制代码

    上述四种构造函数:

    构造函数1没有参数,无法进行类型转换!

    构造函数2有一个参数,可以进行类型转换,如:Demo test; test = 12.2;这样的调用就相当于把12.2隐式转换为Demo类型。

    构造函数3有两个参数,且无默认值,故无法使用类型转换!

    构造函数4有3个参数,其中两个参数有默认值,故可以进行隐式转换,如:Demo test;test = 10;  。

    下面讲述使用了关键字explicit的情况:

    复制代码
     1  1 /* 示例代码2 */
     2  2 class Demo
     3  3 {
     4  4    public:
     5  5     Demo();                     /* 构造函数1 */
     6  6     explicit Demo(double a);        /* 示例代码2 */
     7  7     Demo(int a,double b);           /* 示例代码3 */
     8  8  
     9  9     ~Demo();
    10 10     void Func(void);
    11 11 
    12 12     private:
    13 13     int value1;
    14 14     int value2;
    15 15 };
    复制代码

    在上述构造函数2中,由于使用了explicit关键字,则无法进行隐式转换。即:Demo test;test = 12.2;是无效的!但是我们可以进行显示类型转换,如:

    Demo test;

    test = Demo(12.2); 或者

    test = (Demo)12.2;

  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/spruce/p/13275772.html
Copyright © 2011-2022 走看看