C++中的显式构造和隐式构造

显式构造函数 构造一个对象可以有多种方法,有一种构造用到了隐式转换规则,请看一段代码: class MyClass { string m_name; public: MyClass(const char *name) { m_name = name; } const string &name() const { return m_name; } }; void tmyclass() { M 阅读详情
AI摘要

本文介绍了C++中显式构造和隐式构造的区别。显式构造使用explicit关键字,禁止隐式类型转换,只允许显式调用;隐式构造无该关键字,允许隐式类型转换,但可能导致意外行为。还阐述了二者的适用场景,显式用于防错,隐式可简化代码。

一、概述

在 C++ 中,构造函数可以分为 显式构造 和 隐式构造,它们的区别主要体现在构造函数的调用方式上。

1.显式构造(Explicit Constructor)
显式构造函数是使用 explicit 关键字声明的构造函数。它的作用是防止编译器在某些情况下进行隐式类型转换。
特点:

  • 禁止隐式类型转换:当一个类的构造函数被声明为 explicit 时,编译器不能使用该构造函数进行隐式类型转换(即自动将一个类型转换为另一个类型)。
  • 只允许显式调用:显式构造函数只能通过明确的构造函数调用来创建对象。

2.隐式构造(Implicit Constructor)
隐式构造函数是没有使用 explicit 关键字声明的构造函数。编译器可以根据需要自动调用这些构造函数进行隐式类型转换。
特点:

  • 允许隐式类型转换:如果构造函数没有 explicit 关键字,编译器就可以在适当的地方进行隐式类型转换
  • 可能导致意外的行为:因为编译器会自动进行类型转换,有时可能会引发难以发现的错误。

二、显式构造函数的使用

示例:

#include <iostream>
#include <string>

using namespace std;

class student {
   
   
public:
    explicit student(int _age) {
   
   
        m_age = _age;
        cout << "age=" << m_age << endl;
    }
    
    explicit student(int _age, const string _name) {
   
   
        m_age = _age;
        m_name = _name;
        cout << "m_age = " << m_age << ";name = " << m_name << endl;
    }
private:
    int m_age;
    string m_name;
};

int main(int argc, const char * argv[]) {
   
   
    student xiaoM(18
C++匿名对象与构造函数 前言: 不得不承认,我是一个内心比较躁动的人。如果没有一个纯粹的学习环境,大部分时间我很难静下心来,但是我还要说,学习使我感到快乐。对我而言,大部分埋头啃书的时间都是枯燥乏味的,但是总有那么一些恍然大悟的瞬间,一些云开月明的瞬间,让我兴奋不已,那种无比充实而快乐的感觉,真好! 但是,学到的知识就像捧在手里的雪球,如果不把它攥实或者变大,就会很容易的化掉,最终只剩手心的一点水渍。我曾经无数次想记... 阅读详情

相关推荐

C++ 类的隐式转换与explicit

我们都知道C/C++中的基本数据类型可以发生转换,类也一样可以。类的转换可以分为两种类型: 1. 类的定义与基本数据类型相关,基本数据类型与类相互转换 2. 类的定义与其他类相关,类与类之间相互转换 第二种稍微复杂一点,本文只讨论第一种。 class Person { public: Person() { cout &amp;lt;&amp;lt; &quot;no param con...

wysnkyd的博客 2607

C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

文章目录何时发生隐式类型转换 何时发生隐式类型转换 在大多数表达式中,比int类型小的整数值提升为较大的整数类型 在条件中,非布尔值转换成布尔类型 初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转化成左侧运算对象的类型 算术运算或关系运算对象有多种类型,需要转换成同一种类型 函数调用时也会发生类型转换 ...

Jormungand_V的博客 2856

C++ 显式关键字解析:什么是显式关键字?为什么要使用它?

此外,使用显式构造函数可以减少不必要的类型隐式转换,从而提高代码的安全性和可维护性。在 C++ 中,有的类构造函数只接受一个参数,但这个参数有可能会被隐式转换。如果我们希望避免这种转换,即使是通过编译器自动添加的构造函数,我们可以使用显式关键字。总结一下,显式关键字表示构造函数不能被用于隐式转换,只能以显式方式调用。因此,在编写 C++ 类时,尽量使用显式构造函数,以避免潜在的错误和歧义。上面的代码将不能编译,因为我们将整数值 42 隐式转换为 MyClass 类型,但我们已经使用了。

ByteEchoX的博客 195

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 262

手把手教你用RV1103+SC3336摄像头DIY一个离线人脸门禁原型

本文详细介绍了如何利用RV1103芯片和SC3336摄像头构建离线人脸门禁系统。从硬件选型到算法优化,再到业务逻辑实现,提供了完整的DIY指南。重点讲解了RetinaFace和FaceNet算法在嵌入式系统中的移植与调优,帮助开发者快速实现高效、隐私安全的门禁解决方案。

weixin_26905487的博客 509

Cluster Computing期刊投稿实战:从格式调整到技术检查的全流程解析

本文详细解析了向Cluster Computing期刊投稿的全流程,涵盖心理准备、格式调整、参考文献处理及投稿系统操作。重点介绍了如何利用Springer LaTeX模板,特别是使用picins宏包解决作者简介排版难题,并强调了将BibTeX转换为BBL文件以避免技术审查陷阱,为研究者提供了一份实用的投稿指南。

weixin_28432777的博客 668

反相器(inverter)和缓冲器(buffer)---附加与非门原理图

下面是对反相器(Inverter)和缓冲器(Buffer)从面积、驱动能力、时序等多个角度的详细对比,列出的是一般情况下的比较,具体情况可能会受到工艺节点、设计库和特定设计要求的影响。缓冲器(Buffer)是数字电路中常见的逻辑门之一,用于增强信号的驱动能力,而不改变信号的逻辑状态。如下图所示的CMOS反相器,由一个NMOS和PMOS组成,栅端gate相连作为输入端Vin,漏端相连作为输出端Vout,NMOS的源端接地,PMOS的源端接电源VDD.与反相器不同,缓冲器的输出与输入保持相同的逻辑状态。

hzmscut的博客 1万+

华为防火墙双线路配置实战:5分钟搞定主备自动切换(含健康检查避坑指南)

本文详细介绍了华为防火墙双线路配置实战,包括主备自动切换和健康检查机制的优化技巧。通过智能健康检查机制,华为防火墙能实现毫秒级故障自动切换,确保网络高可用性。文章提供了从架构设计到实战配置的全流程指南,并分享了常见配置误区与解决方案,帮助中小企业快速搭建稳定可靠的网络架构。

weixin_30872337的博客 605

麻雀搜索算法(SSA)详解:从鸟群智能到优化实践

麻雀搜索算法(SSA)是一种新型群智能优化算法,模拟麻雀群体的觅食行为和反捕食机制。该算法将优化问题转化为麻雀群体对食物源的搜索过程,通过发现者、加入者和警戒者的角色分工实现高效优化。SSA具有原理新颖、参数合理、收敛快速等特点,在函数优化、工程设计和机器学习等领域展现出良好应用前景。算法通过数学模型模拟麻雀的觅食策略,包括发现者全局探索、加入者局部开发和警戒者危险预警机制,有效平衡了全局搜索与局部开发能力。SSA相比传统优化算法具有更好的收敛性和优化效果。

qq_42212808的博客 1072

Echarts - 去掉图表上的横线和竖线

效果图 默认效果: 变为如下图所示效果: 实现方法 官方配置文档:https://echarts.apache.org/zh/option.html#radar.splitLine 在 xAxis yAxis 配置中分别加入以下代码: splitLine: { show:false }

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

rosbag分析传感器数据的时间同步情况方法

ROS传感器时间同步分析流程:通过rosbaginfo初步检查bag文件信息,使用rqt_bag可视化时间线分布,采用rostopicecho或Python脚本提取各传感器时间戳并计算时间差统计值(均值/最大差/标准差),最后分析接收与采样时间延迟。量化评估同步精度,识别固定偏移或随机抖动问题,确保多传感器数据对齐,为后续融合处理提供可靠数据基础。

start_up_go的博客 201

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 数据表中的数据查询
下一篇: C++中左值和右值的概念
TechNomad
博客等级 码龄2年 787粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值