C++ 函数中未定义的参数 #包括 使用名称空间std; 类Imp { 公众: int X(int){return 50;} int Y(int Y){return Y;} }; int main() { Imp i; cout

C++ 函数中未定义的参数 #包括 使用名称空间std; 类Imp { 公众: int X(int){return 50;} int Y(int Y){return Y;} }; int main() { Imp i; cout,c++,C++,参数被传递,并被忽略 您的代码没有使用它。同样的情况也会发生,您只是没有命名参数,因此无法访问它。这些参数的参数是以通常的方式传递的,但在相应的函数定义中无法按名称访问这些参数(但是,可以编写异常的机器体系结构特定代码来访问参数) 一个很好的例子是后缀操作符++(和--),它通常作为 #include <iostream> using namespace std; class Imp { public: int X(int) {return 50;}

参数被传递,并被忽略


您的代码没有使用它。

同样的情况也会发生,您只是没有命名参数,因此无法访问它。

这些参数的参数是以通常的方式传递的,但在相应的函数定义中无法按名称访问这些参数(但是,可以编写异常的机器体系结构特定代码来访问参数)

一个很好的例子是后缀操作符++(和--),它通常作为

#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;
}
注意:编译器通常为此类重载传递一个伪参数0

$13.5.7/1-“当后缀增加时 由于使用++ 运算符,int参数将具有 值为0.136“


伪参数类型指示为“int”,并且几乎不总是命名(因此在运算符定义中不使用)

虽然函数中未使用参数,但有时您需要特定的签名。在这种情况下,您可以省略参数名称以避免编译器警告。

在gdb中启动编译程序,您可以看到在程序集级别传递参数,但在调用的方法中忽略参数:

struct A{
   A operator++(int){ 
       // stuff
       // return an appropriate A object
   }
};
主函数的汇编程序代码转储: 0x0000000100000ce3:推送%rbp 0x0000000100000ce4:mov%rsp,%rbp 0x0000000100000ce7:低于$0x10,%rsp 0x0000000100000ceb:lea-0x1(%rbp),%rdi 0x0000000100000cef:mov$0x64,%esi;**0x64=100=您的参数 0x0000000100000cf4:callq 0x100000d82 然后在X方法内部返回值0x32(50),忽略从主方法传递的参数

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>
函数_ZN3Imp1XEi:;X()的汇编程序代码转储; 0x0000000100000d1e:推送%rbp 0x0000000100000d1f:mov%rsp,%rbp 0x0000000100000d22:mov%rdi,-0x8(%rbp) 0x0000000100000d26:mov%esi,-0xc(%rbp) 0x0000000100000d29:mov$0x32,%eax;**0x32=50=您的报税表 0x0000000100000d2e:LEVEQ 0x0000000100000d2f:retq
希望它有帮助,或者至少有兴趣看一看。即使你不适合汇编程序,有时也可以帮助你深入研究并四处看看

为什么你需要运算符++的int参数?我认为
a a=1;a++;
就够了。@nakiya:区别于前缀运算符++(和--)。因此前缀运算符++重载为
A&operator++()
,另外的int参数有助于区分两个同名重载
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