在C ++中重载显式构造函数

时间:2018-06-11 05:20:03

标签: c++ oop constructor overloading explicit

我正在读一本书并得到一些我不太懂的课程设计代码。

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. 我们可以纯粹根据explicit关键字重载方法,例如const关键字吗?在我的例子中,参数类型有点不同,intsize_t

  2. 更重要的问题是为什么。为什么我们需要一个重载的explicit构造函数?在C ++入门中,我认为不建议使用类似参数类型的重载函数。

  3. 编辑:

    我的第二个问题更多是关于上面的代码片段。为什么它有一个带有int参数的构造函数,然后是带有explicit参数的size_t构造函数,intsize_t类型非常接近。因此,没有必要为每个构造函数定义两个构造函数。我相信作者定义了两个构造函数是有原因的,但我不知道为什么,这应该是我的第二个问题。关于explicit关键字的作用并不是一般性问题。遗憾。

1 个答案:

答案 0 :(得分:3)

  

我们是否可以纯粹根据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参数的构造函数,然后是一个带有explicit参数的int构造函数,

我认为你没有任何理由需要两个重载 - explicit。如果这本书没有解释为什么需要它们,我们只能将其归因于作者方面的不清晰。