C++ explicit构造函数

C++中的explicit详解 C++ explicit关键字详解 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用... 阅读详情

http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html

 

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

class String {

String ( const char* p ); // 用C风格的字符串p作为初始化值

//…

}

String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);

 

但是有的时候可能会不需要这种隐式转换,如下:

class String {

       String ( int n ); //本意是预先分配n个字节给字符串

String ( const char* p ); // 用C风格的字符串p作为初始化值

//…

}

 

下面两种写法比较正常:

String s2 ( 10 );   //OK 分配10个字节的空字符串

String s3 = String ( 10 ); //OK 分配10个字节的空字符串

 

下面两种写法就比较疑惑了:

String s4 = 10; //编译通过,也是分配10个字节的空字符串

String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串

 

s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。

为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字:

class String {

       explicit String ( int n ); //本意是预先分配n个字节给字符串

String ( const char* p ); // 用C风格的字符串p作为初始化值

//…

}

加上explicit,就抑制了String ( int n )的隐式转换,

 

下面两种写法仍然正确:

String s2 ( 10 );   //OK 分配10个字节的空字符串

String s3 = String ( 10 ); //OK 分配10个字节的空字符串

 

下面两种写法就不允许了:

String s4 = 10; //编译不通过,不允许隐式的转换

String s5 = ‘a’; //编译不通过,不允许隐式的转换

 

因此,某些时候,explicit 可以有效得防止构造函数的隐式转换带来的错误或者误解

----------------------------------------------------------
explicit   只对构造函数起作用,用来抑制隐式转换。如:   
  class   A   {   
          A(int   a);   
  };   
  int   Function(A   a);   
    
  当调用   Function(2)   的时候,2   会隐式转换为   A   类型。这种情况常常不是程序员想要的结果,所以,要避免之,就可以这样写:   
    
  class   A   {   
          explicit   A(int   a);   
  };   
  int   Function(A   a);   
    
  这样,当调用   Function(2)   的时候,编译器会给出错误信息(除非   Function   有个以   int   为参数的重载形式),这就避免了在程序员毫不知情的情况下出现错误。

总结:explicit   只对构造函数起作用,用来抑制隐式转换。

参考:
http://blog.youkuaiyun.com/smilelance/archive/2007/03/14/1528737.aspx
http://topic.youkuaiyun.com/t/20040509/15/3046021.html

【考试大纲】中级多媒体应用设计师考试大纲 中级多媒体应用设计师考试大纲 阅读详情

相关推荐

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

explicit

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //… } String s1

lhc717的专栏 756

IntelliJ IDEA 2025.1 + Gradle 镜像配置避坑指南:解决依赖下载慢的终极方案

本文针对IntelliJ IDEA 2025.1开发环境中Gradle依赖下载缓慢的问题,提供了详细的镜像配置避坑指南。通过解析Gradle依赖解析机制,重点指导如何正确配置阿里云等国内镜像仓库,并分享验证配置生效、排查常见错误及高级优化技巧,旨在彻底解决依赖下载难题,提升开发效率。

weixin_28835551的博客 532

C++构造函数前面加explicit关键字的作用

/* explicit的作用: 在C++中,explicit关键字是用来修饰类的构造函数的,被修饰的构造函数的类,不能发生相应的隐式类型的转换, 只能以显示的方式进行类型转换。 explicit使用的注意事项: 1.explicit关键字只能用于类内部的构造函数声明上。 2.explicit关键字作用于单个参数的构造函数,被修饰的构造函数的类,不能发生相应的...

weixin_41946900的博客 1976

Spring AI Alibaba实战训练营-05模型输出质量评估

本文介绍了使用Spring AI Alibaba库评估AI模型输出质量的方案。项目通过5种评估器实现自动化评估:相关性评估、事实准确性评估、答案相关性评分、答案正确性评估和忠实度评估。开发步骤包括环境准备(Java 17、Maven、API Key获取)、创建Maven项目、配置Spring AI(通过环境变量安全设置API Key)以及实现RAG流程。重点强调了通过评估器自动检测AI输出的质量指标,帮助开发者优化AI应用性能。

program哲学 217

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

C++ 中explicit关键字详解

目录explicit关键字的作用使用情况类型转换函数单操作数构造函数同时出现拷贝构造函数和类型转换函数拷贝构造函数总结参考文献 explicit关键字的作用 explicit关键字在写程序时使用的次数较少,但是仔细观察会发现,在C++标准库中的相关类声明中explicit出现的频率是很高的,那么explicit关键字到底有什么作用呢?接下来我就为大家一一解答. explicit为清晰的;明确的之意...

l2563898960的博客 2万+

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2570

C++笔记(1)explicit构造函数

C++笔记(1)explicit构造函数 Explicit Constructors(显式构造函数)收藏   按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //… } String s

zerokkqq的专栏 278

uniapp [全端兼容] - 实现上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频和删除功能,上传单个或多个视频文件及大文件(H5、小程序、app)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp+uview上传视频并预览,UNI-APP视频上传组件,实现视频文件上传视频回显,上传视频并预览、上传多个视频,实现上传视频功能+预览,上传显示视频功能,上传视频预览移除,批量上传视频,上传超大视频文件,视频上传并预览效果,uniapp上传视频,使用uview上传视频及预览,上传视频和删除视频功能,视频流上传播放功能,上传视频到后端,视频上传与实时预览功能,upload上传组件,视频播放器

🏆 前端领域优质创作者 1万+

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2640

cpp——类——explicit构造函数

概述 explicit只能修饰构造函数,构造函数默认implicit,implicit不是keyword implicit构造函数:可用于直接初始化,也可用于复制初始化 explicit构造函数:可用于直接初始化,不可用于复制初始化 implicit class CAnimal { public: CAnimal(int group) : mGroup(group) { cout << "CAnimal(" << group << ")" << endl; }

mardax的专栏 645

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

C++: 构造函数中的explicit详解

explicit在 C++ 中,explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化。默认情况下,单参数构造函数既可以显式调用,也可以被编译器用来进行隐式类型转换。explicit这个构造函数只能显式调用,不能用于隐式转换。explicit防止构造函数或转换运算符被隐式调用。在单参数构造函数和转换运算符中使用最为常见。自 C++11 起,还能用于;C++20 引入,进一步增强灵活性。默认加上explicit,除非你有充分理由允许隐式转换。

Ethan_Rich的博客 739

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++中explicit构造函数的理解

1.explicit类型的构造函数和普通类型的构造函数的区别 普通的构造函数可以被显式调用和隐试调用,但是explicit的构造函数只能被显式的调用,不能被隐试的调用。代码示例如下: class test0{ private: int i; public: explicit test0(int n) { i = n; cout << "i = " <&...

仗劍走天涯 992

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ explicit构造函数

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //… } String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”

wo17fang的专栏 914

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++构造函数explicit关键字

C++构造函数explicit关键字

上善若水 1516

C++构造函数前的explicit关键字

我们在阅读C++源码时有时会看到类的构造函数前面会有explicit关键字,这个单词字面意思是显式的(与之相反的单词是implicit,隐式的)。下面就来分析下这个关键字的作用。 一 例子 首先来让我们看一段简单的C++代码, #include &lt;iostream&gt; #include &lt;map&gt; using namespace std; class Person { ...

爱就是是恒久忍耐的专栏 2506

C++ explicit 构造函数

本文主要参考《C++ Primer》第12.4.4小节,以及《Effective C++》第0章。

Michael20070810625的专栏 932

c++中构造函数之前的explicit的作用

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调

交叉编译的博客 458

【C/C++ explicit关键字】为什么有了explicit关键字的构造函数 就不能再有 其无参构造函数

关键字的构造函数,你就不能有相同签名的无参构造函数(默认构造函数),除非后者也标记为。,如果它不是必需的。这是因为无参构造函数可能会被用于隐式类型转换,而。试图调用无参的默认构造函数,而这个默认构造函数与。的构造函数,这样它就不会与带参数的构造函数重载。构造函数重载的无参构造函数,除非你也将其标记为。的构造函数,编译器不允许隐式调用无参构造函数。这样可以避免编译器错误,并确保类型的安全使用。在这个例子中,无参构造函数显式地调用了带。在 C++ 中,如果你有一个带有。关键字时,你需要确保不会创建与。

一起学习进步! 657

C++ 中的explicit构造函数

C++ explicit构造函数   explicit按字面意思是明确的,显式的。在C++类中只要定义的构造函数编译器就不会帮你生成默认构造函数。 按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* str ); // 用C风格的字符串str作为初始化

乐观进取 奋斗不止 911

【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南

目录标题1. 引言1.1 为什么需要了解 `explicit`1.2 文章目标和主要内容概览2. C++ 构造函数简介2.1 什么是构造函数2.1.1 构造函数的基本语法2.1.2 重载构造函数2.2 构造函数的类型2.2.1 默认构造函数(Default Constructor)2.2.2 参数化构造函数(Parameterized Constructor)2.2.3 复制构造函数(Copy Constructor)2.2.4 移动构造函数(Move Constructor)

TyearLin的专栏 3340

c++11对构造函数多过一个参数用explicit

explicit 这个关键字在C++1.0(C++11之前)就已经有了。但C++11提出, explicit for actors taking more than one argument。 例子1:(这个例子不太符合explicit) #include <iostream> using namespace std; class P { public: P(int a, int b) { cout << "P(int a, int b)" &lt

QQ845264718 831

C++关键字:explicit与构造函数浅析

C++关键字:explicit与构造函数 C++关键字explicit常常用来放在接受一个实参的构造函数(non-explicit-one-argument-constructor)前,以防止编译器在某些条件下的默认行为——调用该构造函数来实现类型转换。当声明一个构造函数为explicit时,表示这个构造函数只能通过用户显示调用来创建对象。 首先谈谈explicit常常使用的地方:non-expl...

ha_ha_ha233的博客 481

c++ explicit在构造函数中的应用

explicit的主要用法就是放在单参数的构造函数中,防止隐式转换, 导致函数的入口参数, 出现歧义. 如果可以使用A构造B, 未加explicit的构造函数, 当使用B进行参数处理时, 就可以使用A, 使得接口混乱. 为了避免这种情况, 使用explicit避免隐式构造, 只能通过显示(explicit)构造. 下面是代码, 仔细阅读必有收获, 可以试着删除explicit, 调用注释的语句

扎扎实实写代码的专栏 349
上一篇: Android Binder之经典好文
下一篇: Linux内核之进程上下文和中断上下文的区别
东晋偏安
博客等级 码龄18年 939粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值