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

相关文章

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

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++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类