[英]Overloading explicit constructor in C++
我正在讀一本書,並得到了一些我不太了解的類設計代碼。
class Queue {
public:
Queue(size_t capacity) {}
explicit Queue(int capacity) : entries_(capacity) {}
...
private:
vector<int> entries_;
...
};
還有另一個類似的
class LruCache {
public:
LruCache(size_t capacity) {}
explicit LruCache(int capacity) : capacity_(capacity) {}
...
private:
int capacity_;
...
};
我有兩個問題,
我們是否可以像const
關鍵字那樣僅在explicit
關鍵字上重載方法? 在我的情況下,參數類型有所不同,一個int
和一個size_t
。
一個更重要的問題是為什么。 為什么我們需要重載的explicit
構造函數? 我相信在C ++入門中,建議不要使用具有類似參數類型的重載函數。
編輯:
我的第二個問題是關於上面的代碼。 為什么它有一個帶int
參數的構造函數,然后有一個帶size_t
參數的explicit
構造函數,而int
和size_t
是真正接近的類型。 因此,不必為每個定義兩個構造函數。 我相信作者出於一個原因定義了兩個構造函數,但是我不知道為什么,這應該是我的第二個問題。 關於explicit
關鍵字的作用不是一個普遍的問題。 抱歉。
我們可以僅在
explicit
關鍵字上重載方法嗎?
沒有。
為什么我們需要重載的顯式構造函數?
避免隱式轉換。
假設Queue
已定義為:
class Queue {
public:
// No constructor with a size_t.
Queue(int capacity) {}
...
};
這樣,一個int
將在需要時隱式轉換為Queue
。
void bar(Queue const& q) { ... }
bar(10); // This would be valid without the explicit keyword.
// 10 will be implicitly converted to Queue(10).
有時,此類隱式轉換會導致難以理解和維護代碼。 explicit
限定符用於避免此類隱式轉換。
使用explicit
限定詞后,您將需要使用
bar(Queue(10));
這很容易理解。
為什么它有一個帶有
size_t
參數的構造函數,然后是一個帶有int
參數的explicit
構造函數,
我看不到為什么需要兩個重載的任何原因-是否explicit
。 如果這本書沒有解釋為什么需要它們,我們只能將其歸因於作者缺乏明確性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.