编译器如何区分C++中操作符重载前增量运算符函数和后增量运算符函数?

编译器如何区分C++中操作符重载前增量运算符函数和后增量运算符函数?,c++,operator-overloading,overloading,post-increment,pre-increment,C++,Operator Overloading,Overloading,Post Increment,Pre Increment,正如我们所知,为了区分增量前和增量后运算符函数,我们在增量后运算符函数中使用伪参数。但是编译器如何在内部区分这两个函数,正如我们在函数重载中所知道的,编译器通过传递的参数数量来区分多个同名函数&这些参数是由函数接收的,但这里我们在调用时不传递任何参数,但在函数定义的参数中我们声明“int” 另一个问题,为什么i2=i1++调用后增量函数,为什么不调用前增量函数。由于我们不传递任何值,编译器如何只调用后缀函数。是否预定义“伪参数函数”仅用于后期修复函数调用? 另外,我们是否可以将其他“float”

正如我们所知,为了区分增量前和增量后运算符函数,我们在增量后运算符函数中使用伪参数。但是编译器如何在内部区分这两个函数,正如我们在函数重载中所知道的,编译器通过传递的参数数量来区分多个同名函数&这些参数是由函数接收的,但这里我们在调用时不传递任何参数,但在函数定义的参数中我们声明“int”

另一个问题,为什么i2=i1++调用后增量函数,为什么不调用前增量函数。由于我们不传递任何值,编译器如何只调用后缀函数。是否预定义“伪参数函数”仅用于后期修复函数调用?
另外,我们是否可以将其他“float”、“double”或其他数据类型作为伪参数而不是仅“int”传递?只有一个参数用作伪参数或多个参数?

不确定我是否理解这个问题。编译器可以区分它们,因为它们是两个不同的运算符。x++不同于++x

也许有助于认为自定义运算符只是语法糖,用于调用可以超载的特殊方法。例如,如果您有:

#include <iostream>

struct foo {
    void operator++(int) {
        std::cout << "post";
    }
    void operator++(){
        std::cout << "pre";
    }
};
这与编译器在这里决定调用什么方法没有什么不同:

void bar(int);
void bar();
bar();
bar(0);

对于初学者,应该声明并定义pre-increment操作符,如下所示

Integer & operator++()      // Pre increment
{
   ++x;
   return *this;
}
在这些声明中

i2 = ++i1;
i2 = i1++; 
有一个显式可见的运算符被调用,即一元增量运算符

i2 = ++i1;
i2 = i1++; 
或后缀增量运算符

i2 = ++i1;
i2 = i1++; 
因此,编译器在解析这些语句和选择适当的函数时没有问题

至于最后一个问题,例如,根据C++ 14标准的5.5.7递增和递减< /P> 1名为operator++的用户定义函数实现前缀 和后缀++运算符。如果此函数是非静态成员 不带参数的函数,或带一个参数的非成员函数 参数,它定义的对象的前缀增量运算符+ 那种。如果函数是非静态成员函数,则 参数应为int型或具有 两个参数,第二个参数应为int型,它 为该类型的对象定义后缀增量运算符+。 由于使用++ 运算符,int参数的值为零。1

要在显式调用一元增量运算符和后缀增量运算符时区分它们,需要为后缀增量运算符指定一个等于0的参数

比如说

i1,operator ++();      // the unary increment operator
i1.operator ++( 0 ) ;  // the postfix increment operator 

是否预定义“伪参数函数”仅用于后期修复函数调用?对听起来你可以使用A,但是编译器如何在函数重载中知道这两个函数之间的区别,因为编译器是按照C++的规则开发的吗?我不知道如何回答这样的问题。你是在问如何编写编译器吗?