C++类的 explicit 关键字和隐式转换

2024-05-05 16:48

本文主要是介绍C++类的 explicit 关键字和隐式转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++类的 explicit 关键字和隐式转换

explicit 关键字用于 C++的类定义中,其作用是禁止隐式转换和复制初始化操作:

The explicit specifier specifies that a constructor or conversion
function (since C++11) doesn’t allow implicit conversions or
copy-initialization. It may only appear within the decl-specifier-seq
of the declaration of such a function within its class definition.

这里介绍一个概念:转换构造函数, 它的英文定义如下:

A constructor with a single non-default parameter (until C++11) that
is declared without the function specifier explicit is called a
converting constructor.

大意就是说不用 explicit 关键字声明, 只包含一个非默认参数的构造函数.
具体使用用一个例子来说明:

#include <iostream>using std::cout;struct A
{A(int) { cout << "A(int)\n"; }      // converting constructorA(int, int) { cout << "A(int, int)\n"; } // converting constructor (C++11)A(const A&) {cout << "A(const A&)\n";}operator bool() const { return true; }
};struct B
{explicit B(int) { }explicit B(int, int) { }explicit operator bool() const { return true; }
};int main()
{A a1 = 1; // copy-initialization, call A(int)A a2(2); // direction-initialization, call A(int)A a3 {4, 5}; //direction-list-initialization, call A(int int)A a4 = {4, 5};//copy-list-initialization, call A(int int)A a5 = (A)1; //explicit castif(a1) //copy-initializat, call operator boolcout << "true\n";bool na1 = a1;cout << std::boolalpha << na1 << '\n';bool na2 = static_cast<bool>(a1); cout << std::boolalpha << na2 << '\n';//B b1 = 1; //no viable conversion from 'int' to 'B'B b2 = (B)1; B b3(2);B b4 {4, 5};//B b5 = {4, 5};//chosen constructor is explicit in copy-initializationif(b2)cout << "true\n";//bool nb1 = b2;//no viable conversion from 'B' to 'bool'bool nb1 = b2.operator bool();bool nb2 = static_cast<bool>(b2); 
}

上例中选用了两个 struct, 这里出于使用方便, 你完全可以可用 class, 不过需要使用 public 声明成员函数. A 中没有使用 explicit 关键字, 所以对于 A 隐式转换和复制初始化都可以顺利进行, 但是与之相对 B 由于使用了 explicit 声明, 隐式转换和复制初始化被禁止.

B b1 = 1; 
//no viable conversion from 'int' to 'B'B b2 = (B)1; //explicit conversion
B b5 = {4, 5};
//chosen constructor is explicit in copy-initializationbool nb1 = b2;//no viable conversion from 'B' to 'bool'bool nb1 = b2.operator bool();

这时, 我们或可以强制进行类型转换, 也可显示调用转换函数

这篇关于C++类的 explicit 关键字和隐式转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962179

相关文章

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim