对比C#聊聊C++大一统的初始化运算符 {}

一:背景

最近发现 C++ 中的类型初始化操作,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值类型引用类型 两大块,但发现在 C++ 中没这种说法,默认都是 值类型 😂😂😂

二:各种玩法一览

1. int 上的初始化

首先看一下代码:

int main()
{int i = { 10 };int j{ 10 };printf("i=%d, j=%d", i, j);
}

相比C#来说,不带 = 的写法感觉还是怪怪的。。。接下来看下对应的汇编代码。

int i = { 10 };
00021825  mov         dword ptr [ebp-8],0Ah  int j{ 10 };
0002182C  mov         dword ptr [ebp-14h],0Ah

从汇编代码看,就是一个简单的 栈赋值 ,所以在 int 上用 {} 完全没必要,太伤键盘了。

2. 数组的初始化

继续看例子。

int main()
{int num[] = { 10,11,12 };
}

这种写法中规中矩,基本上 C 系列的语言都这样,对于玩 C# 的我来说,不陌生。。。不过人家默认是值类型,C# 是引用类型,从汇编代码中也能看的出来。

int num[] = { 10,11,12 };
009C1E95  mov         dword ptr [ebp-10h],0Ah  
009C1E9C  mov         dword ptr [ebp-0Ch],0Bh  
009C1EA3  mov         dword ptr [ebp-8],0Ch

3. 结构体的初始化

结构体大家都很熟悉,直接上代码了。

typedef struct _Point
{int x;int y;
} Point;int main()
{Point point = { 10,20 };
}

接下来看一下汇编代码。

Point point = { 10,20 };
00481825  mov         dword ptr [ebp-0Ch],0Ah  
0048182C  mov         dword ptr [ebp-8],14h

可以看到,其实也是一组简单的赋值操作,很方便。

4. 类的初始化

方便讲述,先上代码:

class Location {
private:int x;int y;int z;
public:Location(int x, int y, int z) :x(x), y(y), z(z) {}
};int main()
{Location location = { 10,11,12 };
}

接下来看下汇编代码,是不是调用了 Location 的构造函数。

Location location = { 10,11,12 };
008D183F  push        0Ch  
008D1841  push        0Bh  
008D1843  push        0Ah  
008D1845  lea         ecx,[ebp-14h]  
008D1848  call        Location::Location (08D13A7h)

可以看到确实调用了 构造函数,那个 ecx 就是 location 的 this 指针。

5. initializer_list 模板类

C++ 中的 initializer_list 类可以接收 {} 初始化语法作为初始化操作,这个有一点像 C# 的 param 可选参数,接下来把上例的中构造函数改成 initializer_list 来接收,代码如下:

class Location {
public:int x;int y;int z;
public:Location(initializer_list<int> list) {x = *(const_cast<int*>(list.begin()));y = *(const_cast<int*>(list.begin() + 1));z = *(const_cast<int*>(list.begin() + 2));}
};int main()
{Location loc = { 10,11,12 };printf("loc.x=%d,loc.y=%d,loc.z=%d", loc.x, loc.y, loc.z);
}

接下来看下汇编代码。

Location loc = { 10,11,12 };
00B9518F  mov         dword ptr [ebp-0F8h],0Ah  
00B95199  mov         dword ptr [ebp-0F4h],0Bh  
00B951A3  mov         dword ptr [ebp-0F0h],0Ch  
00B951AD  lea         eax,[ebp-0ECh]  
00B951B3  push        eax  
00B951B4  lea         ecx,[ebp-0F8h]  
00B951BA  push        ecx  
00B951BB  lea         ecx,[ebp-0E4h]  
00B951C1  call        std::initializer_list<int>::initializer_list<int> (0B913C5h)  
00B951C6  mov         edx,dword ptr [eax+4]  
00B951C9  push        edx  
00B951CA  mov         eax,dword ptr [eax]  
00B951CC  push        eax  
00B951CD  lea         ecx,[loc]  
00B951D0  call        Location::Location (0B913ACh)

从汇编代码看,它首先做了 initializer_list 的初始化操作,然后将弄好的集合丢到 Location 构造函数中,反转过来大概就是这样。

int main()
{initializer_list<int> list = { 10,11,12 };Location loc = { list };printf("output: loc.x=%d,loc.y=%d,loc.z=%d", loc.x, loc.y, loc.z);
}

哈哈,是不是感觉 {} 在初始化方面无所不能,好了,本篇就聊到这里了。

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

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

相关文章

[转]【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

前言 很多小伙伴反馈说&#xff0c;高并发专题学了那么久&#xff0c;但是&#xff0c;在真正做项目时&#xff0c;仍然不知道如何下手处理高并发业务场景&#xff01;甚至很多小伙伴仍然停留在只是简单的提供接口&#xff08;CRUD&#xff09;阶段&#xff0c;不知道学习的并发…

【ArcGIS微课1000例】0019:什么是Shapefile文件?Shapefile文件之全解

文章目录 Shapefile文件组成Shapefile文件创建Shapefile文件大小限制Shapefile文件注意事项ESRI Shapefile(shp),或简称shapefile,是美国环境系统研究所公司(ESRI)开发的一种空间数据开放格式。该文件格式已经成为了地理信息软件界的一个开放标准,这表明ESRI公司在全球的…

扼杀 304,Cache-Control: immutable

随着近些年社交网站的流行&#xff0c;越来越多的人学会了“刷”网页 ── 刷微博&#xff0c;刷朋友圈&#xff0c;刷新闻&#xff0c;刷秒杀页。这里的“刷”&#xff0c;就是刷新的意思&#xff0c;在浏览器里&#xff0c;你可以通过点击刷新按钮&#xff0c;或者用快捷键&a…

Eolink是国产API接口管理的无冕之王

一、传统API接口管理的缺陷 1、前言 项目开发我们都知道在一个项目团队中是由很多角色组成&#xff0c;最常见团队的就是前端开发工程师、客户端开发工程师、服务端开发工程师组成一个团队&#xff0c;团队之间进行合作&#xff0c;一般我们都离不开API接口管理和测试&#x…

linux下永久添加静态路由

在linux下永久添加静态路由有两种方法&#xff1a; 添加路由的命令&#xff1a; 1&#xff0c;route add route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0#添加一条静态路由 route add default gw 192.168.0.1#添加默认路由 route del -net 192.168.1.0/24 gw 192.…

【ArcGIS微课1000例】0020:关于ArcCatalog,你知道多少?

文章目录 一、ArcCatalog简介1. ArcCatalog启动和关闭2. ArcCatalog界面3. 菜单栏4. 目录树5. 搜索窗口6. 主窗口7. 工具栏二、ArcCatalog主要功能1. 文件夹连接2. 添加空间数据库连接3. 文件类型的添加和移除4. 文件特性的显示设置5. 导出数据6. 查看数据7. ArcCatalog中图层的…

【数据结构】二叉排序树

二叉排序树&#xff08;Binary Sort Tree&#xff09;又称二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;亦称二叉搜索树。 特点 二叉排序树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 1、若左子树不空&#xff0c;则左子树上所有…

记一次 .NET 某电厂Web系统 内存泄漏分析

一&#xff1a;背景 1. 讲故事前段时间有位朋友找到我&#xff0c;说他的程序内存占用比较大&#xff0c;寻求如何解决&#xff0c;截图就不发了&#xff0c;分析下来我感觉除了程序本身的问题之外&#xff0c;.NET5 在内存管理方面做的也不够好&#xff0c;所以有必要给大家分…

Bomb(hdu 3555)

题意&#xff1a;给定一个闭区间&#xff0c;求区间内有多少数中含“49” /*dp[i][j]表示i位数以j为最高位位中的所有不符合数的个数。然后把数字拆分&#xff0c;乱搞即可。 */ #include<cstdio> #include<iostream> #define lon long long using namespace std; …

《深入实践Spring Boot》下载

本书以丰富的实例&#xff0c;介绍了如何使用SpringBoot开发框架进行基础应用和分布式应用等方面的开发&#xff0c;以及如何使用SpringBoot开发的应用构建高性能的服务平台&#xff0c;同时还对SpringBoot的一些核心代码进行了深入剖析。本书从基本的入门&#xff0c;到数据库…

【ArcGIS微课1000例】0021:ArcToolBox工具箱功能与环境概述

文章目录 一、ArcToolBox功能简介1. 3D分析工具2. 分析工具3. 制图工具4. 转换工具5. 数据管理工具6. 地理编码工具7. 地统计分析工具8. 线性参考工具9. 空间分析工具10. 空间统计工具二、ArcToolBox环境设置一、ArcToolBox功能简介 ArcToolbox的空间处理工具条目众多、功能丰…

[转]将图片转换为 latex 公式

一、官网链接及使用方法 官网链接&#xff08;跨平台&#xff09;: Mathpix 公式截图快捷键截图生成 latex 公式--------------------- 作者&#xff1a;man_world 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/mzpmzk/article/details/84140617 版权声明&…

在SQL Server2005中使用 .NET程序集

昨天完成了一个最简单的在数据库中创建标量值函数,今天主要完成表值函数,存储过程和用户定义类型在和.NET结合下的使用方法.1,表值函数所谓表值函数就是说这个函数返回的结果是一个Table,而不是单个的值.在.NET 中创建这样的函数,返回的结果是一个IEnumerable接口.这个接口非常…

C# 实例解释面向对象编程中的接口隔离原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

Appium同时运行多个设备

为了提高测试效率&#xff0c;测试需要同时在多个android设备上运行&#xff0c;就需要启动多个appium。 启动appium时&#xff0c;为每个设备设置不同的端口号&#xff0c;并为driver设置该设备的udid。见如下实例&#xff0c;关键是红色部分 DesiredCapabilities capabilitie…

AI作画的业界天花板被我找到了,AIGC模型揭秘 | 昆仑万维

一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 AIGC是继 UGC、PGC 之后新型利用AI技术自动生成内容的生产…

【ArcGIS微课1000例】0022:ArcGIS点(点坐标)自动连成线操作案例教程

ArcGIS中,可以将带三维坐标(X、Y、Z)的点/点集自动连成线,本文演示具体操作流程。 文章目录 实战演练GPS点数据下载实战演练 打开ArcMap软件,添加实验文件夹0022下的GPS轨迹点.shp矢量点数据(文末提供下载地址),该数据是由GPS RTK采集的河道点数据,首先需要将GPS点坐…

微信公众号 文章的爬虫系统

差不多俩个星期了吧&#xff0c;一直在调试关于微信公众号的文章爬虫系统&#xff0c;终于一切都好了&#xff0c;但是在这期间碰到了很多问题&#xff0c;今天就来回顾一下&#xff0c;总结一下&#xff0c;希望有用到的小伙伴可以学习学习。 1、做了俩次爬虫了&#xff0c;第…

[转]关于C#操作WPS和office兼容性的问题

最近一直在做的开发是关于导出word的功能&#xff0c;一开始的做法是在VS中直接添加引用office PIA&#xff0c;Microsoft.Office.Interop.Word&#xff0c;VS08有两个版本&#xff0c;V11和V12&#xff0c;V11对应的是office03&#xff0c;V12对应的office07&#xff0c;试验之…