函数中未定义的参数

时间:2010-10-06 12:13:57

标签: c++

#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.我的问题是传递的参数会发生什么?只是出于好奇。 :)

5 个答案:

答案 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   

希望看看有用或者至少有趣。即使你不适合汇编程序,它有时也可以帮助挖掘并环顾四周