当前位置: 首页 符咒

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

栏目:符咒 作者:道教符咒法事法术网 时间:2022-09-23 09:49:48
一:背景 最近发现 C++ 中的类型初始化操作化官非符,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值类型 和 引用类型 两大块,可发现在 C++ 中没这种说法,默认都是 值类型 😂😂😂 二:各种玩法一览1. int 上的初始化 首先看一下代码: intmain inti = { 10}; intj{ 10}; printf( "i=%d, j=%d", i, j); 相比C#来说,不带 = 的写法感觉还是怪怪的化官非符。。。接下来看下对应的汇

一:背景

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

二:各种玩法一览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);

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

法事类型如下:

01.化解太岁法事;   02.升官晋职法事 ;03.文昌考试法事; 04.偿还阴债法事; 05.开财门补财库; 06.助种生基法事; 07.催子受孕法事;08.开运转运法事;09.催财发财法事;10.化解童子法事;11.化解小人法事;12.小儿平安法事;  13.超度亡灵法事; 14.超度宠物法事; 15.超度婴灵法事;16.祈福许愿法事;

01.化解太岁法事;   02.升官晋职法事 ;03.文昌考试法事; 04.偿还阴债法事; 05.开财门补财库; 06.助种生基法事; 07.催子受孕法事;08.开运转运法事;09.催财发财法事;10.化解童子法事;11.化解小人法事;12.小儿平安法事;  13.超度亡灵法事; 14.超度宠物法事; 15.超度婴灵法事;16.祈福许愿法事;fuzhoufashi003.jpg

师父微信:  fuyuntang8

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

师父微信:   fuyuntang8

符咒类型如下:

01.财运符; 02.太岁符;  03. 回心符; 04. 护身符;05. 学业符;06. 开运符; 07. 桃花符; 08. 偏财符; 09 .小人符;10 .事业符;11. 去疾符; 12. 健康符;13. 平安符;14 .和合符;15.定制符;

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


师父微信:   fuyuntang8

阅读:157次

分类栏目