explicit关键字

阅读数:317 评论数:0

跳转到新版页面

分类

C/C++

正文

在C++中,explicit关键字用于修饰类的构造函数,以防止发生隐式类型转换。默认情况下,如果一个构造函数只接受一个参数,它可以被用来进行隐式转换,也就是说,编译器可以自动地将一个给定类型的对象转换为构造函数所在的类的类型。

举一个没有使用explicit关键字的例子:

class MyClass {
public:
    MyClass(int value) {}  // 隐式转换构造函数
};

void functionTakingMyClass(MyClass obj) {}

int main() {
    functionTakingMyClass(5);  // 隐式转换 int 到 MyClass
    return 0;
}

在上面的例子中,functionTakingMyClass接受一个MyClass类型的对象,但是在调用它时传递了一个整数5。由于MyClass的构造函数接受一个int参数,编译器将自动地将5转换成MyClass对象。

现在,如果我们不想这种隐式转换发生,我们可以在构造函数前加上explicit关键字:

class MyClass {
public:
    explicit MyClass(int value) {}  // 阻止隐式转换
};

void functionTakingMyClass(MyClass obj) {}

int main() {
    functionTakingMyClass(5);  // 错误!不能隐式转换 int 到 MyClass
    functionTakingMyClass(MyClass(5));  // 正确,显式转换
    return 0;
}

添加了explicit关键字后,现在编译器将不会自动将5转换为MyClass对象,上面的代码在尝试隐式转换时会导致编译错误。要调用functionTakingMyClass,你必须显式地构造一个MyClass对象。

explicit关键字通常用于防止隐式转换可能导致的意外错误,使得类的使用更加安全和清晰。在现代C++编程中,建议尽可能使用explicit来修饰只接受一个参数的构造函数,除非你有明确的理由需要构造函数能够进行隐式转换。




相关推荐

第1章 认识对象 1.面向对象分析(object-oriented analysis,OOA)的主要任务是分析问题域中的对象、对象之间的关系,然后构造出该问题域的分析模型。分析模型必须简洁、明确地抽象

第一章 C++初步认识 C++对C的“增强”,表现在两个方面: (1)在原来面向过程的机制基础上,对C语言的功能做了不少扩展 (2)增加了面向对象的机制   面向对象和面向过程不是矛盾的,而是各有用途

有一种特殊的指针叫做成员指针,它们通常指向一个类的成员,而不是对象中成员的特定实例。 <span styl

C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11. 转换操作符 static_cast 将一个值以符合逻辑的方式转型。这

组织和策略问题 第0条 不要拘泥于小节(了解哪此东本西不应该标准化) 编程规范不应施加个人喜好或者过时的做法。 第1条 在高警告级别干净利落地进行编译 高度重视警告:使用编译器的最高警告级别。应该要求

它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把<span style="colo

1、C++版本更迭 年份 C++标准 通用名 别名 标准编译选项 GNU扩展选项 1978 C with Classes - - - - 1998 ISO/IEC 14882:199

1、转换操作 (1)static_cast 将一个值以符合逻辑的方式转型。这个可以看作是“利用原值重建一个临时对象,并在设立初值时使用型别转换”。唯有当上述型别转换有所定义时,整个转换才会成功。 如:

一、概述 GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时

一、概念 所谓的预编译头文件就是把工程中不会经常改变的代码预先编译好放在一个文件里(通过是以.pch为扩展名Precompiled heade