对比C#聊聊C++大一统的初始化运算符 {}:化官非符
作者:符咒法事网发布时间:2022-09-23分类:符咒浏览:85
一:背景
最近发现 C++ 中的类型初始化操作化官非符,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值类型 和 引用类型 两大块,可发现在 C++ 中没这种说法,默认都是 值类型 😂😂😂
师父微信: sanqingge8
师父微信: sanqingge8
二:各种玩法一览1. int 上的初始化
首先看一下代码:
intmain
inti = { 10};
intj{ 10};
printf( "i=%d, j=%d", i, j);
相比C#来说,不带 = 的写法感觉还是怪怪的化官非符。。。接下来看下对应的汇编代码。
inti = { 10};
00021825mov dword ptr [ebp -8], 0Ah
intj{ 10};
0002182C mov dword ptr [ebp -14h], 0Ah
从汇编代码看,就是一个简单的 栈赋值 ,所以在 int 上用 {} 完全没必要,太伤键盘了化官非符。
2. 数组的初始化
继续看例子化官非符。
intmain
intnum[] = { 10, 11, 12};
这种写法中规中矩,基本上 C 系列的语言都这样,对于玩 C# 的我来说,不陌生化官非符。。。不过人家默认是值类型,C# 是引用类型,从汇编代码中也能看的出来。
intnum[] = { 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. 结构体的初始化
结构体大家都很熟悉,直接上代码了化官非符。
typedefstruct_ Point
intx;
inty;
} Point;
intmain
Point point = { 10, 20};
接下来看一下汇编代码化官非符。
Point point = { 10, 20};
00481825mov dword ptr [ebp -0Ch], 0Ah
0048182C mov dword ptr [ebp -8], 14h
可以看到,其实也是一组简单的赋值操作,很方便化官非符。
4. 类的初始化
方便讲述化官非符,先上代码:
classLocation{
private:
intx;
inty;
intz;
public:
Location( intx, inty, intz) :x(x), y(y), z(z) {
intmain
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 来接收,代码如下:
classLocation{
public:
intx;
inty;
intz;
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));
intmain
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]
00B951 D0 call Location::Location( 0B913ACh)
从汇编代码看,它首先做了 initializer_list 的初始化操作,然后将弄好的集合丢到 Location 构造函数中,反转过来大概就是这样化官非符。
intmain
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);
哈哈,是不是感觉 {} 在初始化方面无所不能,好了,本篇就聊到这里了化官非符。
标签:化官非符
相关推荐
- 清朝最大贪官非和珅而是他,家产是和珅两倍,洋人唯独不动他府邸:化官非符
- TVB小生杨明懒理官非开心拍新剧外景,直言自己不会戒酒:化官非符
- 生辰八字算事业,这五种人命带“官非”信息!:化官非符
- 刘昊然:为什么单看五官非常平凡,可整体颜值却很高?:化官非符
- 有着很棒的舞蹈功底,五官非常清秀的他,如今更是受人追捧:化官非符
- 失去U23护身符,鲁能飞翼逐渐边缘化,21岁国奥队长正式上位:化官非符
- 约翰尼德普的前妻亮相戛纳红毯,网友:她的五官非常精致!:化官非符
- 易招惹官非的八字特点【八字命理】:化官非符
- 王俊凯说外交官非常令人尊敬:化官非符
- 拱墅祥符:强化党建统领 做实融合治理 打造共同富裕现代化基本单元:化官非符
- 符咒排行