亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

顯式關鍵字意味著什么?

顯式關鍵字意味著什么?

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 關注
  • 623 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號