为了账号安全,请及时绑定邮箱和手机立即绑定

显式关键字意味着什么?

显式关键字意味着什么?

C++ C
慕后森 2019-06-01 15:17:51
显式关键字意味着什么?是什么explicit关键字在C+中的意思?
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

假设,你有一个类String:

class String {public:
    String(int n); // allocate n bytes to the String object
    String(const char *p); // initializes object with char *p};

现在,如果你尝试:

String mystring = 'x';

人物'x'将被隐式转换为int然后String(int)构造函数将被调用。但是,这并不是用户所期望的。因此,为了防止出现这种情况,我们将构造函数定义为explicit:

class String {public:
    explicit String (int n); //allocate n bytes
    String(const char *p); // initialize sobject with string p};


查看完整回答
反对 回复 2019-06-01
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

在C+中,只有一个所需参数的构造函数被视为隐式转换函数。它将参数类型转换为类型。这是否是一件好事取决于构造函数的语义。

例如,如果您有一个带有构造函数的字符串类String(const char* s)这可能正是你想要的。你可以通过一个const char*函数的String,编译器将自动构造一个临时的String对象为您。

另一方面,如果有一个缓冲区类的构造函数Buffer(int size)获取缓冲区的大小(以字节为单位),您可能不希望编译器悄悄地转动intBufferS.若要防止这种情况,请使用explicit关键词:

class Buffer { explicit Buffer(int size); ... }

那样的话,

void useBuffer(Buffer& buf);useBuffer(4);

变成编译时错误。如果你想通过一个临时的Buffer对象时,必须显式地这样做:

useBuffer(Buffer(4));

总之,如果单参数构造函数将参数转换为类的对象,则可能不希望使用explicit关键词。但是,如果有一个构造函数恰好接受单个参数,则应该将其声明为explicit若要防止编译器意外转换,请执行以下操作。


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 574 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信