C++ explicit使用详细举例
时间: 2024-11-19 16:01:00 浏览: 96
C++中的`explicit`关键字用于声明构造函数,它强制要求只有明确指定类型的实例化才能通过该构造函数创建对象,防止隐式类型转换造成的意外行为。这里有两个例子来展示`explicit`的用法:
**例子1: 使用迭代器遍历vector 示例**[^1]
```cpp
#include <iostream>
#include <vector>
class VectorIterator {
public:
explicit VectorIterator(std::vector<int>::iterator it) : iterator(it) {}
private:
std::vector<int>::iterator iterator;
};
void print_vector(const std::vector<int>& vec) {
VectorIterator vi(vec.begin());
for (; vi.iterator != vec.end(); ++vi.iterator)
std::cout << *vi.iterator << " ";
}
int main() {
std::vector<int> vec = {1, 2, 3};
print_vector(vec);
return 0;
}
```
在这个例子中,`VectorIterator`类有一个显式的构造函数,只接受`std::vector<int>::iterator`类型的参数,不能通过其他类型的迭代器。
**例子2: 使用nullptr的示例**
```cpp
#include <iostream>
// 显式构造函数,仅接受char*类型
template<typename T>
void consume(T value) {
if constexpr (std::is_same_v<T, char*> && value == nullptr)
std::cout << "Consuming a null pointer.\n";
else
throw std::invalid_argument("Expected a null pointer");
}
int main() {
consume(nullptr); // 正确调用,因为是明确传递的char*类型
consume(0); // 抛出异常,尝试隐式转换无效
return 0;
}
```
在这个例子中,`consume`函数模板有显式的构造函数,如果传入`nullptr`,函数会正常执行;若试图用非null指针或其他类型调用,会引发异常。
阅读全文
相关推荐


















