对比 C# 聊聊 C++ 中几类特殊成员函数

一:背景

在 C# 中要说默认给我们定义的特殊成员函数,莫过于 构造函数,但在 C++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊。

二:特殊成员函数

1. 默认构造函数

和 C# 一样,很多书中都说,如果用户没有定义 构造函数,那么编译器会给我们定义一个,参考下面的例子:

class Person {public:string name;int age;
};int main()
{Person person;
}

接下来观察下汇编代码,看下有没有调用 默认构造函数 .

Person person;
003E32EF  lea         ecx,[person]  
003E32F2  call        Person::Person (03E15EBh)

对于 C# 学习者来说有点懵哈,定义了就相当于new了, 哈哈,这是因为 C++ 默认都是值类型哈,不过这里有必要澄清一下,并不一定所有情况都会调用 默认构造函数,因为 C++ 的汇编生成由各自 编译器 来决定,如果 编译器 觉得没必要调用 构造函数 那它就会把这一步省掉来加速性能,那什么时候不会调呢?参考如下代码。

class Person {public:void show() {printf("show!");}
};int main()
{Person person;person.show();
}

接下来看下汇编代码。

person.show();
00E73F4F  lea         ecx,[person]  
00E73F52  call        Person::show (0E713B6h)

可以清楚的看到,这种情况下调用 构造函数  其实没有必要,所以编译器就干脆省略了。

2. 析构函数

在 C# 中 析构函数 是由 CLR 负责管理,在 C++ 中没有托管这个概念,所以默认只能是结束作用域之前,自动调用 析构函数 释放,参考如下图:

a714cfdbb32b43a5735ad01e9bef711b.png

3. 赋值构造函数

刚才也说到了,在 C++ 中甭管是 class 还是 struct 默认都是值类型,既然是值类型就存在stack copy 的情况,在 C# 中也是因为重写了 EqualsGetHashCode 来实现的值copy,接下来简单看下代码:

class Person {public:string name;int age;
};int main()
{Person p1 = { "jack",20 };Person p2(p1);
}

再看下 Person p2(p1) 的汇编代码。

Person p2(p1);
000F80A2  lea         eax,[p1]  
000F80A5  push        eax  
000F80A6  lea         ecx,[p2]  
000F80A9  call        Person::Person (0F15C3h)

从汇编中可以看到调用了 Person::Person (0F15C3h) 函数,请注意,这个不是 构造函数,而是 赋值构造函数 😂, 可以调试下去看看哦。。。截图如下:

ac58633bdb063a0d016dfff6939ecc05.png

值得说一下的是,C++ 默认提供的 赋值构造函数 是浅copy,如果要实现深 copy 的话,或者有一些自定义的逻辑,建议自己实现一下。

class Person {public:string name;int age;public:Person(string name, int age) :name(name), age(age) {}Person(const Person& p) {name = p.name;age = p.age;}
};int main()
{Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };Person p2(p1);
}

4. 赋值运算符

在 C# 中 值类型 , 匿名类型, Record 都是重写过 Equals= 运算符,所以可以在这些类型上用 =, 其实在 C++ 中也可以在 class 之间进行赋值,因为编译器会帮我们重写运算符 = ,如何看出来呢?先看下代码:

class Person {public:string name;int age;public:Person(string name, int age) :name(name), age(age) {}Person(const Person& p) {name = p.name;age = p.age;}
};int main()
{Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };p2 = p1;
}

最后一句的 p2 = p1 之所以能成功是因为 = 被重写了,参考汇编代码。

p2 = p1;
00FD967C  lea         eax,[p1]  
00FD967F  push        eax  
00FD9680  lea         ecx,[p2]  
00FD9683  call        Person::operator= (0FD161Dh)
4fc0294d477cf30bdef415683ee215e7.png

如果需要自定义,可以自己重写。

class Person {public:string name;int age;public:Person(string name, int age) :name(name), age(age) {}Person(const Person& p) {name = p.name;age = p.age;}Person& operator = (const Person& p) {name = p.name;age = p.age;return *this;}
};int main()
{Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };p2 = p1;
}

在 C++ 11 中还有特殊的 移动构造函数移动赋值构造函数, 这个还需要理解 左值 和 右值引用,篇幅有限,放到后面和大家聊了哈。

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

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

相关文章

Js 枚举定义Layer Icon

layer的icon有7种样式:1-7 [图片来自:https://blog.csdn.net/beauxie/article/details/60959971] 有时候常常记不住 😣,不防自己定义一哈: var layerIcon {//无none: -1,//成功success: 1,//失败error: 2,//提问、疑…

前端进阶之路: 前端架构设计(2)-流程核心

可能很多人和我一样, 首次听到"前端架构"这个词, 第一反应是: "前端还有架构这一说呢?" 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的架构要…

C语言试题195之实现strnchr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strnchr函数功能 函数名称:在字符串中查找字符 函数原型:char *strnchr(cons…

8.2设备文件及磁盘分区

2019独角兽企业重金招聘Python工程师标准>>> 概览: 设备文件的创建 权限 设备名 类型 主设备号 次设备号 mknod [-m MODE] NAME type [MAJOR MINOR] 创建时,先查看是否存在设备号的冲突 零磁道零扇区是MBR:Maste…

【ArcGIS风暴】ArcGIS求一个矢量图层中多个图斑的“四至点”坐标案例教程

如图所示,为ArcGIS软件自带的全球矢量数据,怎样求取每个大洲(图斑)的四至坐标(xmin、ymin、xmax、ymax)呢? 参考阅读:【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码 文章目录 1. 矢量数据加载2. 四至计算结果3. 四至计算过程1.…

一个关于导出excel模板的实例

1 首先jsp页面 点击模板下载&#xff0c;会自动下载模板&#xff45;&#xff58;&#xff43;&#xff45;&#xff4c;&#xff0c;效果如下 让我们看源码&#xff1a; &#xff11; &#xff4a;&#xff53;&#xff50;页面 <div class"tab-pane" id"p…

腾讯视频VIP会员,周卡特价9.5元!

今天给大家推荐特价充值腾讯视频VIP会员的平台——幻海优品&#xff0c;腾讯视频在线直充&#xff0c;VIP会员实时生效&#xff01;腾讯视频VIP会员特价充值周卡&#xff1a;原价12元&#xff0c;特价9.5元月卡&#xff1a;原价30元&#xff0c;特价22元季卡&#xff1a;原价68…

解决安装SQL Server 2005开发版时,出现“SQL Server 服务无法启动 ”点击重试或取消的解决方法

问题描述&#xff1a; 安装SQL Server 2005开发版时&#xff0c;提示SQL Server服务无法启动&#xff0c;有关详细信息&#xff0c;请参阅SQL Server联机丛书中的主题如何查看SQL Server 2005安装日志文件和手动启动SQL Server&#xff0c;如下图所示。 此时&#xff0c;如果点…

C语言试题196之实现strstr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strstr函数功能 C 库函数 char *strstr(const char *haystack, const char *nee…

关于数据结构(二)

文章目录[点击展开](?)[] 一UI返回功能思路分析实现方法二当前正在CD技能接着上文<<关于数据结构(一)>>&#xff0c;关于数据结构&#xff0c;在实际的开发中或多或少都有涉及到&#xff0c;只是看自己平时没有积累到。下面是我在项目中的几个实例&#xff1a; 一…

JDBC 之 事务

1.概念&#xff1a;事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部不成功。 2.数据库开启事务的命令dtl&#xff1a; Start transaction开启事务 Rollback回滚事务&#xff08;撤销&#xff09; Commit提交事务 3.JDB…

[转]后端程序员必备:书写高质量SQL的30条建议

以下文章来源于捡田螺的小男孩 &#xff0c;作者捡田螺的小男孩 转载&#xff1a;《后端程序员必备&#xff1a;书写高质量SQL的30条建议》 前言 本文将结合实例demo&#xff0c;阐述30条有关于优化SQL的建议&#xff0c;多数是实际开发中总结出来的&#xff0c;希望对大家有…

GIS热词:AR、VR、MR辨析

AR、VR、MR技术让我们见识到了科技神奇的同时&#xff0c;也让真实可感的现实世界和无法触摸的虚拟世界的联系更加紧密。 1. AR AR&#xff0c;全称Augmented Reality&#xff0c;即增强现实技术。这项技术是利用电脑技术将虚拟的信息叠加到真实世界&#xff0c;通过手机、平板…

云原生数据库是未来数据库的天下

一、传统数据库的发展阶段和痛点 1&#xff09;、传统数据库的发展阶段 ✨人工管理阶段 20世纪50十年代中期以前&#xff0c;计算机只是用来计算的&#xff0c;那么数据管理就只能纯人工. ✨文件系统管理阶段 20世纪50年代后期到60年代中期&#xff0c;这时硬件方面有了磁盘、磁…

用.NET做DDNS动态域名解析和SSL证书申请

本文主要介绍 IPv6 配置 DDNS 解析和 SSL 证书申请工具的开发历程和其中的相关知识。工具使用.NET开发&#xff0c;已开源&#xff0c;目前该工具的域名解析只支持阿里云。文中提及或使用的 .NET 开源项目&#xff1a;SangServerTool&#xff08;DDNS,SSL证书申请工具&#xff…

汇编学习(一)

看的是王爽老师的《汇编语言》第三版基础知识 一.汇编语言的诞生上古时期在汇编语言还未出现的时候&#xff0c;那时的程序员还只能用二进制也就是所谓的机器语言写代码&#xff0c;将0和1编成的程序代码打在纸带或卡片上&#xff0c;再将纸带卡片输入计算机&#xff0c;进行运…

【GIS风暴】GeoJSON数据格式案例全解

在了解GeoJSON数据之前,先来通过一个网站和一个简单的代码案例,看一下GeoJSON的神奇魅力吧! 网站:http://geojson.io 打开上述网站,在左侧的代码区域粘入中国区域GeoJSON代码,如下所示: 中国地图: 地名:

[转]2020年5月程序员工资统计,平均14542元

平均工资 2020年5月全国招收程序员312761人。2020年5月全国程序员平均工资14542元&#xff0c;工资中位数12500 元&#xff0c;其中95%的人的工资介于5250元到35000元。 一线城市工资 2020年5月北京招收软件工程师24478人。2019年5月北京软件工程师平均工资19273元&#xff0…

云原生IDE:iVX免费的首个通用无代码开发平台

一、iVX简单介绍 1、iVX是什么东东? iVX 是一个 “零代码” 的可视化编程语言&#xff0c;拥有方便的 在线集成开发环境 &#xff0c;不需要下载开发环境&#xff0c;打开浏览器即可随时随地的进行项目编辑&#xff1b;iVX 拥有 “一站式” 的云资源&#xff0c;通过这一套一…

.NET GC工作流程

前言在上文[如何获取GC的STW时间]一文中&#xff0c;我们聊到了如何通过监听GC发出的诊断事件来计算STW时间。里面只简单的介绍了几种GC事件和它的流程。群里就有小伙伴在问&#xff0c;那么GC事件是什么时候产生的&#xff1f;分别是代表什么含义&#xff1f;那么在本文就通过…