#include <iostream>
using namespace std;
class Imp
{
public:
int X(int) {return 50;}
int Y(int y) {return y;}
};
int main()
{
Imp i;
cout << i.X(100) << endl;
return 0;
}
这段代码工作并打印出来50.我的问题是传递的参数会发生什么?只是出于好奇。 :)
答案 0 :(得分:2)
这些参数的参数以通常的方式传递,但是不可能在相应的函数定义中按名称访问这些参数(但是可以编写特殊的机器体系结构特定代码来访问参数)
一个很好的例子是后缀运算符++(和 - ),它通常被重载为
struct A{
A operator++(int){
// stuff
// return an appropriate A object
}
};
注意:编译器通常会为此类重载传递伪参数0
$ 13.5.7 / 1-“当后缀增加时 因使用++而被调用 运算符,int参数将具有 值零.136“
伪参数类型表示为'int',并且几乎不总是命名(因此不在运算符定义中使用)
答案 1 :(得分:1)
参数被传递,并被忽略。
您的代码不使用它。
答案 2 :(得分:0)
完全相同的事情发生了,你只是没有为参数命名,因此无法访问它。
答案 3 :(得分:0)
虽然参数未在函数内部使用,但您需要特定的签名。在这种情况下,您可以省略参数名称以避免编译器警告。
答案 4 :(得分:0)
在gdb中启动已编译的程序,你可以看到在程序集级别传递参数,但在被调用的方法中被忽略:
Dump of assembler code for function main:
0x0000000100000ce3 <main+0>: push %rbp
0x0000000100000ce4 <main+1>: mov %rsp,%rbp
0x0000000100000ce7 <main+4>: sub $0x10,%rsp
0x0000000100000ceb <main+8>: lea -0x1(%rbp),%rdi
0x0000000100000cef <main+12>: mov $0x64,%esi ; ** 0x64 = 100 = your argument
0x0000000100000cf4 <main+17>: callq 0x100000d82 <dyld_stub__ZN3Imp1XEi>
然后在X方法内部返回值0x32(50),忽略从main方法传递的参数。
Dump of assembler code for function _ZN3Imp1XEi: ; X();
0x0000000100000d1e <_ZN3Imp1XEi+0>: push %rbp
0x0000000100000d1f <_ZN3Imp1XEi+1>: mov %rsp,%rbp
0x0000000100000d22 <_ZN3Imp1XEi+4>: mov %rdi,-0x8(%rbp)
0x0000000100000d26 <_ZN3Imp1XEi+8>: mov %esi,-0xc(%rbp)
0x0000000100000d29 <_ZN3Imp1XEi+11>: mov $0x32,%eax ; ** 0x32 = 50 = your return
0x0000000100000d2e <_ZN3Imp1XEi+16>: leaveq
0x0000000100000d2f <_ZN3Imp1XEi+17>: retq
希望看看有用或者至少有趣。即使你不适合汇编程序,它有时也可以帮助挖掘并环顾四周