怎么理解 C++ 的 explicit 关键字?

简介: 给构造函数声明 explicit 可以阻止它们被用来执行隐式类型转换(implicit type conversions)。本文通过一个例子来直观地帮助大家理解 C++ 中的 explicit 关键字。

给构造函数声明 explicit 可以阻止它们被用来执行隐式类型转换(implicit type conversions),例如对于下面的代码:

using namespace std;

class Student {
public:
    int id, score;
    Student(int id = 0, int score = 0) : id(id), score(score) {}
};

void display(Student s) {
    cout << "ID: " << s.id 
         << ", Score: " << s.score << endl;
}

int main() {
    display(1);
    Student s = 1;
    cout << "ID: " << s.id 
         << ", Score: " << s.score << endl;
    return 0;
}

我们定义了一个 Student 类,然后构造函数没有用 scplicit 声明,该类有两个变量,分别是学生的学号 id 和分数 score,并且都有默认值 0. 还定义了一个函数 display 来打印出 Student 类的两个变量。

main 函数中我们调用 display(1),按照函数的定义,应该是传入一个 Student 类的,但是现在是传入一个整数 1,按道理应该不是正确的用法,正确的用法应该是 display(Student(1))。对于 Student s = 1; 直接将整数 1 赋值给一个 Student 类,按道理也应该是不正确,正确的应该是 Student s(1)

但是这个代码可以编译并且成功运行,并且输出:ID: 1, Score: 0

这就是发生了隐式类型转换。如果给构造函数前面加上 explicit 关键字声明,类定义变成:

using namespace std;

class Student {
public:
    int id, score;
    explicit Student(int id = 0, int score = 0) : id(id), score(score) {}
};

其他的不变,只是第 6 行加了一个 explicit,那么就会编译不通过。因为这个时候就无法进行隐式类型转换。

main 函数重新写成这样:

int main() {
    display(Student(1));
    Student s(1);
    cout << "ID: " << s.id
         << ", Score: " << s.score << endl;
    return 0;
}

就可以编译通过正常执行,并且输出:ID: 1, Score: 0

目录
相关文章
|
20天前
|
存储 安全 编译器
【C++专栏】C++入门 | auto关键字、范围for、指针空值nullptr
【C++专栏】C++入门 | auto关键字、范围for、指针空值nullptr
34 0
|
4天前
|
C++
C++中使用namespace关键字定义和访问命名空间的技术性探讨
C++中使用namespace关键字定义和访问命名空间的技术性探讨
11 3
|
14天前
|
Java 编译器 C语言
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(下)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
10 0
|
14天前
|
C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(中)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
25 0
|
14天前
|
编译器 C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(上)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
12 1
|
14天前
|
编译器 C语言 C++
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(下)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
20 0
|
14天前
|
存储 安全 编译器
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(上)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
22 0
|
20天前
|
编译器 C++
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
9 2
|
20天前
|
程序员 C++
为什么c++要引入class关键字
总之,C++引入 `class`关键字是为了支持面向对象编程,通过封装、继承、多态和抽象等特性,提供了更强大、灵活和可维护的编程工具,使得程序开发更加高效和可扩展。这使C++成为一种强大的编程语言,广泛用于各种应用领域。
33 1
|
20天前
|
C语言 C++
【C++入门】关键字、命名空间以及输入输出
【C++入门】关键字、命名空间以及输入输出