explicit构造函数

explicit构造函数的作用 explicit构造函数是用来防止隐式转换的。看下面一段代码: 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 ; // 阅读详情
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
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   只对构造函数起作用,用来抑制隐式转换。
告别Root!用Termux+ADB在Android上玩转自动化(保姆级教程) 本文详细介绍了如何在非Root环境下使用Termux和ADB实现Android自动化操作,无需Root权限即可运行自动化脚本。通过Termux搭建Linux终端环境,结合ADB无线调试和Python脚本,实现点击、滑动、截图等自动化功能,适用于定时任务、自动签到等场景。 阅读详情

相关推荐

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

cpp——类——explicit构造函数

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

mardax的专栏 645

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

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

仗劍走天涯 992

银河麒麟系统下VSCode安装全攻略:从下载到桌面快捷方式(附常见问题解决)

本文详细介绍了在银河麒麟系统下安装和优化VSCode的全流程,包括环境准备、安装策略、权限管理、桌面快捷方式创建以及系统级性能调优。特别针对国产系统环境提供了常见问题解决方案和必备插件推荐,帮助开发者高效配置开发环境。

v6b7n8m9q0的博客 1134

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

使用explicit构造函数

使用explicit构造函数

qqrrjj2011的博客 1387

【WRF编译-Lab1】使用自动脚本编译WRF:错误总结

WRF编译过程及错误总结

WW、forever的博客 83

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

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

一起学习进步! 657

微信小程序 - 超详细小程序接入腾讯地图的完整流程,提供地图显示、IP 属地定位、地理位置名称、获取经纬度等超多功能示例(可一键复制并运行的功能源代码,详细的注释及常见问题汇总)小白直接上手!

微信小程序腾讯地图怎么接入,小程序项目中使用腾讯地图sdk,小程序中使用腾讯地图,微信小程序集成腾讯地图功能,微信小程序通过ip获取其地址、经纬度、详细地址,小程序使用腾讯地图跨域解决方法,微信小程序引入腾讯地图详细教程,原生小程序引入腾讯地图,微信小程序如何植入腾讯地图,微信小程序腾讯地图配置及使用详细教程,小程序植入腾讯地图SDK,微信小程序项目怎么用腾讯地图,微信小程序IP属地定位,获取当前用户位置名称,微信小程序如何使用腾讯地图获取用户的定位位置,在小程序中使用腾讯地图,实现定位,距离计算,实时搜索

🏆 前端领域优质创作者 8806

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1576

应用篇:explicit声明的构造函数作用

应用篇:explicit声明的构造函数作用应用篇:explicit声明的构造函数作用总结转载需注明出处 应用篇:explicit声明的构造函数作用 总结   // explicit构造函数是用来防止隐式转换的。请看下面的代码:   1 class Test1   2 {   3 public:   4 Test1(int n) { num = n; } //普通构造函数   5 private:   6 int num;   7 };   8   9 class Test2   10 {   11 pub

qq_49710945的博客 435

YOLO11全网首发:CVPR2026 Transformer注意力 | BinaryAttention 1-bit注意力,推理提速100%,超越FlashAttention2

本文改进:BinaryAttention 结合YOLO11的C3k2模块,全网首发创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 855

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

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

Ethan_Rich的博客 739

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

explicit 构造函数

一、构造函数、默认构造函数、合成的默认构造函数 构造函数,是函数名与类名相同、没有返回类型的特殊的成员函数。可以有初始化列表。 默认构造函数,没有形参,或所有形参都有默认实参的构造函数。 如果没有显示定义任何构造函数,编译器会自动创建合成的默认构造函数。一个类哪怕只定义了一个构造函数(不管是不是默认构造函数),编译器也不会再生成默认构造函数。 合成的默认构造函数使用与变量初始化相同

buxizhizhou530的专栏 1873

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++ explicit构造函数

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

wo17fang的专栏 914

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

为什么要用explicit指定构造函数

c++ explicit关键字

qq_37688986的博客 765

explicit显式构造函数

1.接受一个单参数const char*的string构造函数不是explicit的; 2.接受一个容量参数的vector构造函数是explicit的。 ********************************************************************************************* explicit是什么意思? 它是用来修饰只有一个

大克 1011
上一篇: 堆排序建堆复杂度为O(n)的证…
下一篇: C/C++浮点数在内存中的存储…
wakeupwakeup
博客等级 码龄11年 9粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值