簡體   English   中英

重載C ++中的顯式構造函數

[英]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_;
...
};

我有兩個問題,

  1. 我們是否可以像const關鍵字那樣僅在explicit關鍵字上重載方法? 在我的情況下,參數類型有所不同,一個int和一個size_t

  2. 一個更重要的問題是為什么。 為什么我們需要重載的explicit構造函數? 我相信在C ++入門中,建議不要使用具有類似參數類型的重載函數。

編輯:

我的第二個問題是關於上面的代碼。 為什么它有一個帶int參數的構造函數,然后有一個帶size_t參數的explicit構造函數,而intsize_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM