C++——隐式类型转换

news2024/9/24 5:31:14

隐式类型转换(构造函数的隐式调用)

先看一下隐式类型转换如何发生吧:

#include <iostream>
using namespace std;

class point {
    public:
    	int x,y;
    	point(int x=0, int y=0):x(x),y(y) {}
}

void displayPoint(const point &p)
{
	cout << "( " << p.x << "," << p.y << " )";
}

int main()
{
   displayPoint(1);
    point p = 1;
}

我们定义了一个很简单的point类,它的构造函数使用了默认参数(int x=0, int y=0),这时main函数里的两句都触发了构造函数的隐式调用

如果构造函数不使用默认参数,会在编译时报错

很显然,函数displayPoint需要的是point类型的参数,而我们传入一个int数据,这个程序能够成功运行,并且成功输出(0,0)说明隐式调用了构造函数。另外需要注意的是,在对象刚刚定义的时候,使用赋值操作符=,调用的是构造函数,而不是operator=运算符

这种悄然发生的事情,有时可以带来便利,让你的程序可以继续运行,而更多的会带来很多意想不到的结果,explict关键字用来避免这样的情况发生

explicit 关键字

c++11中对explicit的解释为指定构造函数或转换函数(operator type())为显示,即它不能用于隐式转换和复制初始化

在上面point示例中,构造函数被explicit修饰后,就不能被隐式调用了,主函数中的两句声明定义将不会通过编译

能用就用

如果我们能预料某种情况的发生,就不要把这个情况控制权交给编译器。即使没有加explicit的构造函数,我们也应该先声明point p(1),再把p作为参数传递给displayPoint函数

Effective C++中也写到

被声明为explicit的构造函数通常比non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换,除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit,我鼓励你遵循同样的政策

operator用于隐式类型转换

C++中的operator主要有两种作用,一是操作符重载,二是自定义对象类型的隐式转换。在上面提到的point类中,我们提到如果构造函数没有默认参数,隐式转换的时候就会编译出错,但是如果我们利用operator的第二个作用,就可以自定义隐式转换类型。

#include <iostream>
#include <string>
using namespace std;

class point {
    public:
        point(int x, int y):x(x),y(y) {
            cout << "constructor" << endl;
        }

        bool operator()(int x, int y) {
            cout << "opearator overload" << endl;
            return x>this->x && y>this->y;
        }

        operator string() {
            cout << "type convert" << endl;
            string str = "(" + x;
            str += "," + y;
            str += ")";
            return str;
        }
    private:
        int x,y;
};

int main()
{
    // part1
   point p1(5,6);
   if(p1(10,9)){
       cout << "point(10,9) is larger than  point(5,6)" << endl;
   }
   
    // part2
   string str(p1);
	cout << str;
}

运行结果如下:

主函数的part1调用的是operator的重载作用,我们主要探讨part2的隐式转换作用。我们往string类的构造函数中传递的point类,显然string类中必然没有以point类为参数的构造函数,但是从运行结果来看,这次构造是成功的。

如果string类有默认参数的构造函数,那么string str(p1)会隐式调用该默认参数的构造函数来构造string。对于没有默认参数的构造函数情况下,类的隐式类型转换,是使用一个其他类型构造当前类的临时对象,并用此临时对象来构造当前对象,这种转换必须有其他类型的构造函数支持;而operator算子的隐式类型转换,就是使用当前类型对象生成另一个类型的对象(正好与没有默认参数构造函数情况下,类的隐式转换相反),这种转换必须有operator算子的支持。

在这个例子中,string str(p1)是将point类对象转换成string类对象,使用的是string类的隐式构造(转换),string类不存在有默认参数的构造函数,也不存在以point类为参数的构造函数,那么string类就需要去point类中去找以operator算子修饰的将point类转为string类的转换函数,并调用该函数,最终返回的string临时对象,被string类用来拷贝构造成一个新的string对象str

参考文章
C++ explicit 关键字

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

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

相关文章

基于场景分析法的电动车优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

计算机图形学中的曲线问题

文章目录免责前言拉格朗日插值多项式第一步&#xff1a;得到一个基函数第二步&#xff1a;得到所有基函数第三步&#xff1a;对所有基函数进行线性组合举例验证三次埃尔米特插值多项式第一步&#xff1a;得到第一维基函数第二步&#xff1a;得到第二维基函数第三步&#xff1a;…

【Linux03-基本工具之make和makefile】Linux下的项目构建工具+进度条小程序

前言 接上篇&#xff0c;接着学习基本工具。 博主水平有限&#xff0c;不足之处望请斧正。 三、make和makefile 是什么 makefile(Makefile)&#xff1a;用来写入 依赖关系和依赖方法 的文件。 make&#xff1a;用来执行 makefile 的命令。 为什么 允许我们自动化构建项目…

必看知识点:Redis 中的原子操作(1)-Redis 中命令的原子性

必看知识点&#xff1a;Redis 中的原子操作(1)-Redis 中命令的原子性 Redis 如何应对并发访问 Redis 中处理并发的方案 业务中有时候我们会用 Redis 处理一些高并发的业务场景&#xff0c;例如&#xff0c;秒杀业务&#xff0c;对于库存的操作。。。 先来分析下&#xff0c…

CMake中add_executable的使用

CMake中的add_executable命令用于使用指定的源文件向项目(project)添加可执行文件&#xff0c;其格式如下&#xff1a; add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 ...]) # Normal Executables add_executable(<name> I…

芯片漫游指南(1)-- UVM世界观

目录1 uvm中的学习内容2 类库地图3 工厂机制3.1 工厂的意义3.2 工厂提供的便利3.3 覆盖方法4 核心基类4.1 uvm_object4.2 域的自动化4.3 拷贝&#xff08;copy&#xff09;4.4 比较4.5 打印4.6 打包和解包5 phase机制5.1 概述5.2 phase的九个执行机制5.3 UVM仿真顺序6 config机…

Jenkins安装和配置 (一)

(一) 环境准备 准备一台linux虚拟机&#xff0c;我这里选择的是Ubuntu&#xff0c;安装jdk、maven、git环境 Ubuntu 16.04 虚拟机JDK 1.8MAVEN 3.3.9GIT (二) Jenkins下载安装 Jenkins安装支持以下几种方式&#xff1a; npm包下载安装war包下载安装docker镜像下载安装 这里我…

开发一个简单的http模板之序章

流程 1.当通过开发HTTP模块来实现产品功能时&#xff0c;是可以完全享用Nginx的优秀设计所带来的、 与官方模块相同的高并发特性的。不过&#xff0c;如何开发一个充满异步调用、无阻塞的HTTP模块 呢2. 需要把程序嵌入到Nginx中&#xff0c;也就是说&#xff0c;最终编译出的二…

考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

【YOLO系列改进NO.45】首发最新特征融合技术RepGFPN(DAMO-YOLO)

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

[附源码]计算机毕业设计springboot云南美食管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

语义分割在线标注思路

语义分割选择使用多边形框标注&#xff0c;相对于物体检测它多了一项计算mask掩膜的需求。 一个图片&#xff0c;可能会进行多项标注。每项标注里面都会在物体检测的格式基础上增加mask属性&#xff0c;mask解释为图像掩膜&#xff0c;里面存与图像宽高对应大小的二维数组。 此…

什么是蛋白质组学?

导读 本文[1] 将从蛋白质组学的定义&#xff0c;蛋白质组包含的类型&#xff0c;常用技术&#xff0c;面临的挑战等方面&#xff0c;对蛋白质组学进行一个简要的介绍。 1. 定义 “蛋白质组学”一词于 1995 年首次出现&#xff0c;被定义为对细胞系、组织或生物体所有蛋白质的大…

Vue-router 路由间参数传递看完让你明明白白!

目录概述路由传参的两大载体分类声明式路由 【router-link 】编程式路由 【this.$router.push()】传参的方式1. 通过 params 传递参数配置路由参数字段占位&#xff08;编程式路由实现&#xff09;配置路由参数字段占位&#xff08;声明式路由实现&#xff09;无需配置路由参数…

Spring框架(四):Spring命名空间和配置标签

Spring框架&#xff08;四&#xff09;&#xff1a;Spring命名空间和配置标签命名空间介绍配置标签Beans标签DemoImport标签Demoalias标签的Demo和Debug痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架基础、一些面试题&#xff0c;以及sql的使用淡忘了。本章节的开始是…

剩余内存无法满足申请时,系统会怎么做?

文章目录前言内存的分配机制回收可回收内存的类型如何在保证系统性能前提下回收内存可回收类型角度: 调整文件页回收倾向回收的方式角度: 尽早触发kswapd内核线程从计算机CPU架构角度: 采用NUMA如何保护进程不被OOM杀掉总结前言 当我们向操作系统申请内存时候,是否有想过一个问…

Bootstrap页面整合(十二)

首先引入bootstrap&#xff1a; 复制导航条代码&#xff1a; 修改导航条&#xff1a; 删除 改完的导航条&#xff1a; <!--导航条--> <nav class"navbar navbar-inverse"><div class"container-fluid"><!--屏幕自适应的--><d…

【吴恩达机器学习笔记】十、支持向量机

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

神经气体网络(NGN)和不断增长的神经气体网络(GNGN)研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[附源码]计算机毕业设计springboot影评网站系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…