最简单的是宏展开,很巧妙:
比较高级的是用C++的构造函数特性——对象创建时默认调用构造函数:
最后一种其实已经违规了,用了if,本质是跳转,但是作为一种技巧,还是跟大家说一下:
可以看一下汇编代码:
注意到call指令会将当前指令压栈。接着看becall里:
那个_a$ = 8表示参数a在堆栈中的位置是8,为什么是8呢?因为堆栈是向下生长,压入越多,esp越小,返回地址eip占用了4个字节,而保存ebp又占用了4个字节,所以要偏移8个字节才能得到a的值。并且紧跟a相邻的就是eip的值,也就是返回地址。这个程序相当于将eip的地址作为整型返回了。
注意,这个方法仅适用于用堆栈传递参数,而不适用于用寄存器传递参数。