zoukankan      html  css  js  c++  java
  • explicit浅谈

    在C++中,explicit关键字主要用于防止隐式转换,用于修饰构造函数、复制构造函数。

    例如有一个类:

    class A 
    { 
    public: 
        A( int count ) : m_data( count ){} 
    private: 
        int m_data; 
    };
    
    int main() 
    { 
        A a = 0;  //ok , conver int to A 
    
        a = 10; // 这里是什么操作?  等价与 a.operator=( 10 );
    } 

    1、 A a = 0;

    首先编译器( compiler )认为这样写是不符合规矩的,因为 A = A才是正常行为但是它不放弃,通过搜索发现A可以根据一个int构造,同时这个A( int count)没有用explicit修饰过。那么A a=0编译器将自动将整形转为A类对象,实际上等同下面操作

    A temp( 0);

    A a = temp;

    这里需要说明的是 A a = tmp 调用的是拷贝构造函数( copy constructor),虽然clas A中没有,但是通常不写的话,编译器会生成一个成员逐一赋值( memberwise assignment )的拷贝构造函数,底层实现通常会以memcpy进行

    2、a = 10;

    首先这里同构造函数一样,编译器( compiler ) 无法进行直接操作,等同于代码

    a.operator=( 10 );

    需要注意的是, a = tmp是调用的赋值运算符( assignment操作 ), 同构造函数一样,我们自己不写, 编译器会生成一个成员逐一赋值(memberwise assignment)操作。

    3、fun( A a )

    同样, fn(10)也是不对的, 但是"按照惯例", 会有:
    A tmp(10);
    fn( tmp ) ;

    注意拷贝构造函数的写法只能是 T::T(const T &);

    而赋值运算符的写法可以多变,即以任意T为例:

    可以有

    T &operator = (int n);
    也可有
    T &operator = (const char *);

    当然, 你要确认如此的定义是对T而言有意义.

  • 相关阅读:
    OpenCV使用边缘提取、腐蚀、轮廓进行车牌定位
    How To Move Or Rebuild A Lob Partition
    Hadoop入门进阶步步高(三)-配置Hadoop
    [学习笔记]整体DP
    leetcode404
    leetcode349
    leetcode383
    leetcode453
    leetcode455
    leetcode167
  • 原文地址:https://www.cnblogs.com/staring-hxs/p/3702227.html
Copyright © 2011-2022 走看看