我正在读一本书并得到一些我不太懂的课程设计代码。
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_;
...
};
我有两个问题,
我们可以纯粹根据explicit
关键字重载方法,例如const
关键字吗?在我的例子中,参数类型有点不同,int
和size_t
。
更重要的问题是为什么。为什么我们需要一个重载的explicit
构造函数?在C ++入门中,我认为不建议使用类似参数类型的重载函数。
编辑:
我的第二个问题更多是关于上面的代码片段。为什么它有一个带有int
参数的构造函数,然后是带有explicit
参数的size_t
构造函数,int
和size_t
类型非常接近。因此,没有必要为每个构造函数定义两个构造函数。我相信作者定义了两个构造函数是有原因的,但我不知道为什么,这应该是我的第二个问题。关于explicit
关键字的作用并不是一般性问题。遗憾。
答案 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
。如果这本书没有解释为什么需要它们,我们只能将其归因于作者方面的不清晰。