加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c++ explicit关键字

发布时间:2020-12-15 04:48:32 所属栏目:百科 来源:网络整理
导读:考虑以下代码: class A { private: int a; public: A(int i):a(i){} }; int main() { A a1 = 1; //OK return 0; } 上面main中1是内置的int型,但是编译器把它隐式地转化成了A类型,因为刚好A的构造函数只有一个参数且该参数为int型。 这看起来很方便,但有

考虑以下代码:

class A

{

private:

int a;

public:

A(int i):a(i){}

};

int main()

{

A a1 = 1; //OK

return 0;

}

上面main中1是内置的int型,但是编译器把它隐式地转化成了A类型,因为刚好A的构造函数只有一个参数且该参数为int型。


这看起来很方便,但有时却可能带来不想要的结果,如下例:

class myString

{

public:

string str = "";

myString(int len)

{

str.resize(len);

}

myString(const char p)

{

str.append(1,p);

}

};

int main()

{

myString s = '0';

cout << s.str <

cout << s.str.size() <

}

这里我们的想法是要把s变成‘0’这个字符,然后输出的却是空字符且长度为48——这是因为编译器隐式地把‘0’转化成了int,也就是48(‘0’的ACII码),然后用这个48去调用myString(int)这个构造函数。这就是编译器的方便性、却带来了不想要的结果。


为了不发生这种意想不到的情况,需要在构造函数前加explicit关键字:

class myString

{

public:

string str = "";

explicit myString(int len) //explicit构造函数

{

str.resize(len);

}

explicit myString(const char p) //explicit构造函数

{

str.append(1,p);

}

};

int main()

{

myString s = '0'; //错误:‘0’没法再隐式转化成myString类了

myString s('0'); //OK

cout << s.str <

cout << s.str.size() <

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读