對比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.pswp.cn/news/284853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284853.shtml
英文地址,請注明出處:http://en.pswp.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;試驗之…