符咒法事
道教符咒买符咒招财法事超度法事
当前位置:网站首页 > 符咒 > 正文

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

作者:符咒法事网发布时间:2022-09-23分类:符咒浏览:85


导读:一:背景最近发现C++中的类型初始化操作化官非符,没有{}运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为值类型和引用类型两大块...

一:背景

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

师父微信:  sanqingge8

宿业, 镇宅, 化煞, 度亡, 禳灾, 超度, 超渡, 土地爷, 谢神, 酬神, 贵人, 扶持, 求财, 神位, 神像, 开光, 接龟, 凶煞, 恶煞, 聪明开智, 小人口舌, 赐福吉祥, 生意求财, 添寿, 延寿, 城隍, 化官非, 堕胎超度, 化解童子, 送替身, 祛病, 百解, 放生, 求子, 送子, 化太岁, 请太岁, 谢太岁, 姻缘和合, 斩桃花, 召桃花, 夜啼, 安魂, 开业利市, 祈雨, 净坛, 奠基破土, 补财库, 开财库, 太上老君, 真武荡魔, 观音祈愿, 净宅, 月老, 召神召将, 转运开运, 忏悔疏文, 圆明斗姥, 王灵官, 赵公明, 九天应元, 九天玄母, 和合仙师, 合婚, 噩梦消除, 装藏, 安龟君, 仙家, 文昌疏文, 玉皇疏文, 三官疏文, 关煞, 解厄, 送钱疏文, 升学功名, 求职疏文, 礼斗,财神, 五路, 救苦, 太乙, 驱邪, 天师, 祈福,.jpg

寺庙供佛用什么香帮别人上香供佛什么香比较好替别人上香有什么说法吗找人代替上香应注意什么供菩萨的香用什么好供佛的香哪几种供佛一般用什么香.jpg

师父微信:   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);

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

标签:化官非符