C++修饰构造函数的explicit关键字

2023-11-17

C++ explicit关键字的作用主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换。

如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

class MyClass

{

public:

  MyClass(int num);

}

MyClass obj = 10; //ok, convert int to MyClass

上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:

MyClass temp(10);

MyClass obj = temp;

上面的所有的操作即是所谓的“隐式转换”。

如果要避免这种自动转换的功能,可以在声明构造函数的时候前面添加上explict关键字,将类的构造函数声明为“显示”,这样就可以防止这种自动的转换操作。

修改上面的MyClass类的构造函数为显示的,下面的代码将不能够编译通过,如下所示:

class MyClass

{

public:

  explicit MyClass(int num);

}
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。
所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用,使用, 不能作为类型转换操作符被隐含的使用。 呵呵, 看来还是光明正大些比较好。
explicit构造函数的作用
解析:
explicit构造函数是用来防止隐式转换的。请看下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Test1
{
public:
    Test1(int n)
    {
        num=n;
    }//普通构造函数
private:
    int num;
};
class Test2
{
public:
    explicit Test2(int n)
    {
        num=n;
    }//explicit(显式)构造函数
private:
    int num;
};
int main()
{
    Test1 t1=12;//隐式调用其构造函数,成功
    Test2 t2=12;//编译错误,不能隐式调用其构造函数
    Test2 t2(12);//显式调用成功
    return 0;
}
Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++修饰构造函数的explicit关键字 的相关文章

  • boost::asio + std::future - 关闭套接字后访问冲突

    我正在编写一个简单的 TCP 客户端来发送和接收单行文本 异步操作由 std future 处理 以便于超时阻塞查询 不幸的是 我的测试应用程序在破坏服务器对象时因访问冲突而崩溃 这是我的代码 TCP客户端 hpp ifndef TCPCL
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 基于 EMQX 和 Neuron 的工业物联网 MQTT Sparkplug 解决方案

    引言 Sparkplug 是基于 MQTT 的一种专门为工业自动化和物联网应用而设计的通信协议 要搭建 Sparkplug 解决方案 需要两个核心组件 一个是 MQTT Broker 负责消息的分发和管理 另一个是边缘节点 负责将本地设备接
  • Python机器学习之k-means聚类算法

    1 引言 所谓聚类 就是按照某个特定的标准将一个数据集划分成不同的多个类或者簇 使得同一个簇内的数据对象的相似性尽可能大 同时不再一个簇内的数据对象的差异性也尽可能大 聚类算法属于无监督学习算法的一种 k 均值聚类的目的是 把 n个点 可以
  • 【Python自动化Excel】Python与pandas字符串操作

    Python之所以能够成为流行的数据分析语言 有一部分原因在于其简洁易用的字符串处理能力 Python的字符串对象封装了很多开箱即用的内置方法 处理单个字符串时十分方便 对于Excel csv等表格文件中整列的批量字符串操作 pandas库
  • 分享8个Python赚钱的接单平台!兼职月入5000+

    如果说当下什么编程语言最靠谱或者比较适合搞副业 答案肯定100 是 Python python是所有语法中最简单易上手的语言 不需要特别的的英语词汇量 逻辑思维也不需要很差就能上手 而且学会了之后就能编写代码爬取各种数据 制作各种图表 提升
  • 类与类之间的几种关系

    http www cnblogs com liuling archive 2013 05 03 classrelation html 一 继承关系 继承指的是一个类 称为子类 子接口 继承另外的一个类 称为父类 父接口 的功能 并可以增加它
  • MySQL查询原理简述

    一 MySQL查询 1 单表查询 根据where条件过滤表中的记录 每过滤一次形成一张中间表 中间表对用户是不可见的 然后根据select的选择列返回最终的结果 2 两张表连接查询 对两表求积 笛卡尔积 行相乘 列相加 并用on条件和连接类
  • Java进阶01:Hibernate教程

    一 Hibernate概述 1 什么是Hibernate Hibernate是一个开放源码的ORM Object Relational Mapping 对象关系映射 框架 它对JDBC进行了轻量级的封装 使得Java开发人员可以使用面向对象
  • 在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答

    您可以通过集简云数据流程 将语聚AI助手集成到抖音视频评论 抖音私信 实现自动回复用户视频评论 私信问答 大大提升账号互动与运营效率 效果如下 自动化流程 抖音普通号评论对接语聚AI 点击可一键使用 抖音企业号私信对接语聚AI 点击可一键使
  • MES生产制造执行系统与APS计划排产系统相关名词解释

    1 MES生产制造执行系统 MES不只是工厂的单一信息系统 而是横向之间 纵向之间 系统之间集成的系统 即所谓经营系统 对于SCP ERP CRM 数据仓库等近年被关注的各种企业信息系统来说 只要包含工厂这个对象 就离不了MES 2 主生产
  • gateway+nacos秒级上下线

    gateway nacos秒级上下线 spring cloud gateway和nacos是我们常用的组件 如果不做处理 服务启动或停止后在gateway上并不会立即上线或者下线 带来的问题就是 部署服务的时候 要把新的服务启动 等待gat
  • 新版3.6.1 Android Studio 解决AndroidStudio编译出现available for offline mode的问题

    问题 异常全文 Error A problem occurred configuring project app Could not resolve all dependencies for configuration app debugA
  • 骨牌与斐波那契数列

    文章目录 一 斐波那契数列的算法 1 递归法 2 一般算法 二 骨牌铺方格算法 1 递归法 2 一般算法 Description 在2 n的一个长方形方格中 用一个1 2的骨牌铺满方格 输入n 输出铺放方案的总数 例如n 3时 为2 3方格
  • 3年外包出来,字节,阿里,华为全是一面挂,感觉废了....

    测试员可以先在外包积累经验 以后去大厂就很容易 基本不会被卡 事实果真如此吗 但是在我身上却是给了我很大一巴掌 所谓今年今天履历只是不卡简历而已 如果面试答得稀烂 人家根本不会要你 况且要不是大厂出来的 可能上面这些面试资格都拿不到 这么多
  • 从头学编程:零基础入门指南

    文章目录 前言 一 编程的基础概念 二 选择一门编程语言 三 学习编程基础 四 掌握编程工具 五 参与开源社区 七 不断练习和实践 八 总结 关于Python技术储备 一 Python学习路线 二 Python基础学习 1 开发工具 2 学
  • 基于LeNet-5的手写数字识别实战

    图像识别是计算机视觉最常用的任务之一 几乎所有的有关图像识别的教程都会将MNIST数据集作为入门数据集 因为MNIST数据集是图像识别问题中难度最小 特征差异较为明显的数据集 非常适合作为图像识别入门者的学习案例 本案例使用MNIST数据集
  • 下载神器IDM安装与使用(保姆级教程)

    下载神器IDM安装与使用 保姆级教程 文章目录 下载神器IDM安装与使用 保姆级教程 前言 一 下载地址 二 IDM是什么 三 作用与特点 四 安装步骤 总结 前言 众所周知 下载工具是大家电脑里必装的软件之一 但大多数都存在 下载慢 收费
  • 服务器之间拷贝文件

    源机器 python m SimpleHTTPServer 10089 目标机器 wget 127 0 0 1 10089 xxx tar
  • 反序列化漏洞原理详解

    Apache shiro简介 Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码和会话管理 使用Shiro的易于理解的API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网络和企业应用程
  • dlcache文件夹可以删除吗_C盘空间严重不足,原来这些文件夹是可以删除的,不要弄错了...

    今天早上刚起床打开电脑 就发现电脑开机很慢 等电脑成功打开后 才发现系统C盘爆红了 昨晚就玩了一会儿游戏 肯定是有东西混进系统C盘里面了 接下来我们就来看看C盘里面有哪些英文文件夹可以删除 一 可删除文件夹 1 Help Help的意思大家
  • C++修饰构造函数的explicit关键字

    C explicit关键字的作用主要是用来修饰类的构造函数 表明该构造函数是显式的 禁止单参数构造函数的隐式转换 如果C 类的构造函数有一个参数 那么在编译的时候就会有一个缺省的转换操作 将该构造函数对应数据类型的数据转换为该类对象 如下面