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而言有意义.

  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/staring-hxs/p/3702227.html
Copyright © 2011-2022 走看看