zoukankan      html  css  js  c++  java
  • C++中 explicit的用法

    在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
    #include <iostream>
    using namespace  std;
    
    class A
    {
    public:
    
         explicit A(int a)
        {
            cout<<"创建类成功了!"<<endl;
    
        
        }
        
        
    
    };
    int main()
    {
    
        A a=10;
        return 0;
    }
    上面的代码编译不成功,原因是当显式地定义了一个带一个参数的构造函数( 带explicit),必须要显示地调用构造函数,
    
    A a(10);
    
    如果不加 explicit的话
    
    A a=10;
    
    实际的转换过程如下:
    相当于直接调用A(10);
    
    (1explicit
    explicit 只能用于类内部的构造函数声明上。
    explicit 作用于单个参数的构造函数或者只有零个或一个没有默认值得多个参数的构造函数。
    
    
    2)何时用explicit
    
    当我们不希望自动类型转换的时候用,其实标准库好多构造函数都是explicit的
    
    比如说vector <int> ivec(10);  //这种定义看起来一目了然
    
    不能写成vector <int> ivec=10//此种定义让程序员感到疑惑
    3)何时不用explicit
    
    当我们需要隐式转换的时候
    
    比如说String类的一个构造函数
    
    String(const char*);
    
     
    
    定义成这样的好处,在需要隐式转化的时候编译器会自动地帮我们转换,标准库里面的String就是一个好的证明。
    
    具体来说:
    
     
    
    我们可以这样String str="helloworld";//直接调用构造函数
    
     
    
    String str="hello"+str+"world";
    
     
    
    调用重载的+操作符号,此过程相当于:
    String temp("hello"); //调用构造函数
    
    String str=temp+str;
    
    String t("world");//调用构造函数
    
    String str=str+t;
    
    明白隐式转换在我们自己写类的时候,尤其是些操纵内存的类的时候很有用。
    
     转载自:http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5644573
    class Circle
    {
    public:
        explicit Circle(double r) : R(r) {}
        explicit Circle(int x, int y = 0) : X(x), Y(y) {}
        explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
    private:
        double R;
        int    X;
        int    Y;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    //一下3句,都会报错
        //Circle A = 1.23; 
        //Circle B = 123;
        //Circle C = A;
        
    //只能用显示的方式调用了
    //未给拷贝构造函数加explicit之前可以这样
             Circle A = Circle(1.23);
            Circle B = Circle(123);
            Circle C = A;
    
    //给拷贝构造函数加了explicit后只能这样了
             Circle A(1.23);
            Circle B(123);
            Circle C(A);
        return 0;
    }
    转载自:http://blog.csdn.net/just_a_beginning/article/details/4341999
  • 相关阅读:
    23种设计模式-桥接模式
    23种设计模式-单列模式
    23种设计模式-迭代器模式
    23种设计模式-组合模式
    23种设计模式-备忘录模式
    23种设计模式-适配器模式
    23种设计模式-状态模式
    SVN的安装和应用
    线程、线程池
    条形码
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4666107.html
Copyright © 2011-2022 走看看