Hi,欢迎来到嵌入式培训高端品牌 - 华清远见教育科技集团<北京总部官网>,专注嵌入式工程师培养15年!
当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 关于explicit构造函数
关于explicit构造函数
时间:2017-01-06作者:华清远见

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

class X
         {
                  public:
                           X(int a);
                           X(double b);
         };
         X::X(int a)
         {
                  cout << "X(int)" << endl;
         }
         X::X(double b)
         {
                  cout << "X(double)" << endl;
         }

如果像下面这样声明类对象:
         X x1 = 10.1; //OK 隐式转换,等价于X x1 = X(10.1)
         程序打印:X(double)

假如构造函数改成下面的形式 :
         X(int a);
         Explicit X(double b);
         程序打印:X(int) .

从此例子中可以看到,explicit对构造函数起的作用是:抑制了隐式装转换。

但是有的时候可能会不需要这种隐式转换,如下:

class X
         {
                  public:
                           X(int a) {
                                    cout << "X(int)" << endl;
                           }
           }
         int fun(X x);

当调用 fun(2)的时候:

程序打印:X(int)。和程序员期待的不同。

给构造函数加上explicit后:

编译器给出了错误信息,这就避免了在程序员毫不知情的情况下出现错误。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)