C++面向对象编程:explicit关键字

explicit关键字的作用就是防止有一个参数的类构造函数进行隐式自动转换。

所以explicit只能用于修饰只有一个参数的类构造函数,表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。

在C++中,构造函数可以允许隐式类型转换,允许单参数构造函数将其参数类型自动转换为其类类型的对象,除非使用explicit关键字显式地禁止。

class CxString  // 没有使用explicit关键字的类声明, 即默认为隐式声明。 
{  
public:  char *_pstr;  int _size;  CxString(int size)  {  _size = size;                // string的预设大小  _pstr = malloc(size + 1);    // 分配string的内存  memset(_pstr, 0, size + 1);  }  CxString(const char *p)  {  int size = strlen(p);  _pstr = malloc(size + 1);    // 分配string的内存  strcpy(_pstr, p);            // 复制字符串  _size = strlen(_pstr);  
}  
//假设重载了”=“运算符和拷贝构造函数.  
};  

CxString string1(24);  

  正确:直接调用单参数构造函数CxString(int size),为CxString对象预分配24字节大小的内存。

CxString string4("aaaa");

  正确:直接调用CxString(const char* p)构造函数,使用C字符串"aaaa"初始化对象。

CxString string2 = 10;   

  正确:利用隐式类型转换,将整数10转换为CxString类型,等价于CxString string2(10);。

CxString string5 = "bbb";

  正确:通过隐式类型转换,将C字符串"bbb"转换为CxString对象,实质上调用CxString(const char* p)构造函数。

CxString string6 = 'c';

 正确:通过隐式类型转换,将字符'c'(其ASCII码值)作为整数传递给CxString(int size)构造函数。

string1 = 2;

 正确: 将整数2隐式转换为CxString类型,然后使用赋值操作。这里假设已重载赋值运算符,以处理CxString对象的赋值。

在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。"CxString string2 = 10;"这段代码, 编译器自动将整型转换为CxString类对象, 实际上等同于下面的操作:

CxString string2(10);  

或  

CxString temp(10);  

CxString string2 = temp;  

"CxString string2 = 10;" 和"CxString string6 = 'c';" 显得不伦不类, 而且容易让人疑惑。可以在单个参数的构造函数前面使用explicit关键字,阻止这种隐式转换。

class CxString {
public:char *_pstr;int _size;explicit CxString(int size) {_size = size;                // 字符串的预设大小_pstr = static_cast<char *>(malloc(size + 1));    // 分配字符串的内存memset(_pstr, 0, size + 1);}explicit CxString(const char *p) {int size = strlen(p);_pstr = static_cast<char *>(malloc(size + 1));    // 分配字符串的内存strcpy(_pstr, p);            // 复制字符串_size = strlen(_pstr);}// 析构函数~CxString() {free(_pstr);                  // 释放分配的内存}// 拷贝构造函数CxString(const CxString& other) : _size(other._size) {_pstr = static_cast<char *>(malloc(_size + 1));strcpy(_pstr, other._pstr);}// 赋值运算符CxString& operator=(const CxString& other) {if (this != &other) {  // 防止自我赋值char* newpstr = static_cast<char *>(malloc(other._size + 1));strcpy(newpstr, other._pstr);free(_pstr);_pstr = newpstr;_size = other._size;}return *this;}
};

 调用结果:

CxString string1(24);     // OK  

    CxString string4("aaaa"); // OK  

CxString string2 = 10;    // 不行, explicit关键字取消了隐式转换  

    CxString string6 = 'c';   // 不行, 调用的是CxString(int size), 且size等于'c'的ascii码, explicit关键字取消了隐式转换  

    CxString string3;         // 不行, 因为没有默认构造函数  

    string1 = 2;              // 不行, 因为取消了隐式转换  

    string2 = 3;              // 不行, 因为取消了隐式转换  

    string3 = string1;        // 不行, 因为取消了隐式转换, 除非类实现操作符"="的重载

  Effective C++:除非有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit,鼓励大家遵循相同的政策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yii特性

Yii几乎拥有了当今Web 2.0应用发展的全部特性。下面是这些特性的一个简短的清单。 模型-视图-控制器&#xff08;MVC&#xff09;设计模式&#xff1a;Yii在WEB编程中采用这一成熟的技术从而可以更好的将逻辑层和表现层分开。数据库访问对象&#xff08;DAO&#xff09;和Acti…

Unity学习笔记之【IK反向动力学操作】

反向动力学Inverse Kinematics 反向动力学&#xff0c;简称IK。相较于正向动力学&#xff0c;反向动力学旨在子级对父级产生的影响。 使用IK&#xff0c;可以实现根据目标位置或方向来计算并调整角色的关节&#xff08;骨骼&#xff09;链&#xff0c;以使角色的末端&#xff…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称&#xff1a;GPT),有GPT-4和G…

Node.js_基础知识(全局变量)

介绍 global&#xff1a;相当于浏览器里的window对象process&#xff1a; 是nodejs用来控制和管理进程的工具 主要方法&#xff1a; cwd&#xff1a;获取当前的工作目录&#xff0c;是执行node命令时候的项目地址。补充&#xff1a;__dirname是被执行的js文件地址。chdir&…

无头浏览器 Puppeteer-案例demo

一、无头浏览器 Puppeteer基础介绍&#xff1a; 我们日常使用浏览器的步骤为&#xff1a; 启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器&#xff0c;能模拟真实的浏览器使用场景。 有了无头浏览器&#xff0c;我们就能做包括但…

(十六)springboot实战——spring securtity的认证流程源码解析

前言 本节内容是关于spring security安全框架认证流程的源码分析&#xff0c;spring security的认证流程主要是在UsernamePasswordAuthenticationFilter过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户的认证的。 正文 1…

MySQL数据库练习【二】

MySQL数据库练习【二】 一、MySQL基本语法二、建库建表-数据准备三、MySQL经典50题-题目四、MySQL经典50题-答案4.1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数4.2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数4.…

云计算运维1

1、企业服务器LNMP环境搭建 集群&#xff1a;多台服务器在一起作同样的事 。分布式 &#xff1a;多台服务器在一起作不同的事 。 环境准备&#xff1a; 1、设置静态ip&#xff08;NAT模式网关为.2&#xff09; # cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"E…

【多模态大模型】Latent Diffusion:在潜在空间而非像素空间进行操作,从而减少了计算复杂度

Latent Diffusion Stable Diffusion 和 Latent Diffusion扩散模型的成本问题子问题1: 高计算成本和训练复杂度子问题2: 保持生成图像的视觉保真度子问题3: 实现多模态和高分辨率图像合成子问题4: 保持图像质量与细节Latent Diffusion 过程&#xff1a; 总结子问题/子解法1&…

关于php匿名函数中的use

匿名函数中的use&#xff0c;其作用就是从父作用域继承变量。 下例是最常见的用法&#xff0c;如果不使用use&#xff0c;函数中将找不到变量$msg。 <?php $msg [1,2,3]; $func function()use($msg){print_r($msg); }; $func(); ?>运行输出 Array ([0] > 1[1] …

识别CMS指纹与WAF识别

目录 识别CMS指纹 1 什么是CMS指纹&#xff1f; 2 常见的CMS指纹 3 识别CMS指纹的方法有哪些&#xff1f; &#xff08;1&#xff09;分析HTTP响应头&#xff0c;识别CMS的特定标头。 &#xff08;2&#xff09;通过配置文件/特殊文件 &#xff08;3&#xff09;分析网站…

SSM框架,Spring-ioc的学习(上)

知识点引入 关于框架 框架( Framework )是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统&#xff0c;它可以用来构建更高级别的应用程序。框架的设计和实现旨在解决特定领域中的常见问题&#xff0c;帮助开发人员更高效、更稳定地实现软件开发目…

iOS 需求 多语言(国际化)App开发 源码

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

第5章——深度学习入门(鱼书)

第5章 误差反向传播法 上一章中&#xff0c;我们介绍了神经网络的学习&#xff0c;并通过数值微分计算了神经网络的权重参数的梯度&#xff08;严格来说&#xff0c;是损失函数关于权重参数的梯度&#xff09;。数值微分虽然简单&#xff0c;也容易实现&#xff0c;但缺点是计…

STM32内存管理

一.什么是内存管理 内存管理是计算机系统中的一个重要组成部分&#xff0c;它负责管理计算机的内存资源。内存管理的主要目标是有效地分配、使用和释放内存&#xff0c;以满足程序的运行需求。 内存是计算机用于存储程序和数据的地方&#xff0c;它由一系列内存单元组成&#…

Flink 2.0 状态存算分离改造实践

本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术&#xff08;一&#xff09;中 的分享&#xff0c;内容关于 Flink 2.0 状态存算分离改造实践的研究&#xff0c;主要分为以下四部分&#xff1a; Flink 大状态管理痛点 阿里云自研状态存储后端 Gemini 的存…

利用路由懒加载和CDN分发策略对极客园项目进行性能优化

文章目录 前言1.配置路由懒加载2.项目资源打包3.包体积可视化分析4.cdn配置 总结 前言 极客园项目的完成之后&#xff0c;我们需要对项目进行打包以及性能优化&#xff0c;优化用户体验以及加快响应时间&#xff0c;本文只列举了路由懒加载和cdn分发的策略 1.配置路由懒加载 …

政安晨:快速学会~机器学习的Pandas数据技能(二)(索引、选择与赋值)

小伙伴们&#xff0c;今天这篇文章里讲到的操作&#xff0c;专业的数据科学家每天都会执行这个动作数十次。你当然也可以做到&#xff01; 概述 选择pandas DataFrame或Series中的特定值进行操作是几乎任何数据操作中的一个隐含步骤&#xff0c;因此在使用Python处理数据时&am…

怎么给《Cyberpunk 2077》制作功能性MOD

Cyberpunk的官方mod支持【REDmod】&#xff1a;https://www.cyberpunk.net/zh-cn/modding-support。官网有三个视频教程&#xff0c;其中第二集演示了脚本的替换&#xff0c;比较合程序员的胃口。 REDmod 是《赛博朋克 2077》的免费 DLC&#xff08;须购买游戏之后才能下载&am…