在函数重载期间调用的决定性事项是什么?

时间:2012-02-18 18:13:55

标签: c++ overloading

我只是想知道在进行函数调用时有哪些决定性因素 超载。我知道它的参数签名,传递的参数数量 其中起着重要作用。但是还有const部分也是重要的 部分超载与否。第1和第2功能的重载工作正常,但如果添加 第三个函数使用const作为传递参数的特性,我得到编译错误。 int A::sum(int, int) and int A::sum(int, int) cannot be overloaded。只需给出类的代码片段:

class A
{
    private:
    int x;
    int y;

    public:
    int sum ( int a, int b )
    {
        cout << " Inside 1st ";
        return (a+b) ;
    }

    int sum (int a ,int b) const
    {
        cout << " Inside 2nd ";
        return (a+b) ;
    }

    int sum (const int a ,const int b)
    {
        cout << " Inside 3rd ";
        return (a+b) ;
    }

    A(){x=0;y=0;}
    ~A(){};
}; 

当我声明普通对象并调用sum时,第一个函数被调用,而在const对象的情况下,第二个函数被调用。那很好。但如果我写第一和第三功能,它就成了一个问题。为什么这样?

2 个答案:

答案 0 :(得分:5)

你可以在const上重载,但只能在实际上有所不同的地方。我的意思是“实际上有所作为”?好吧,如果你宣布

void foo(char *ptr);
void foo(const char *ptr);

const很重要:你说foo的一个重载保证不会修改ptr 指向的内存,而另一个不会吨。但是如果你宣布

void foo(int x);
void foo(const int x);

const 重要:标量参数始终按值传递,因此foo的假设变体都不能修改x的值它的来电者,即使它想要。因此,C ++标准表示const被丢弃,这是相同函数的两个不同声明,其中一个是错误的。

const相对于*的位置很重要。指针本身就是一个标量,所以这些也是同一函数的两个声明:

void foo(char *ptr);
void foo(char *const ptr);

因为这里const限定指针本身而不是它指向的对象。

这给我们带来了方法:在方法声明的参数列表之后的const限定符适用于this指向的对象,并且可以重载:

struct A
{
  int foo (char *ptr);
  int foo (char *ptr) const;
  int foo (const char *ptr);
  int foo (const char *ptr) const;
};

您应该将这些声明视为内部重写:

struct A {};
int A_foo (A *this, char *ptr);
int A_foo (const A *this, char *ptr);
int A_foo (A *this, const char *ptr);
int A_foo (const A *this, const char *ptr);

然后一切都按照重载函数的正常规则工作。

答案 1 :(得分:2)

const和非const函数可以重载。(函数后跟const
即它是函数重载的有效标准。

但是,示例中的函数不能基于函数参数的const重载,因为参数的常量根本不重要。函数参数通过值传递,函数接收到复制 函数重载需要在相同的命名函数之间存在一些区别标准,除非const on参数实际上使函数重载与编译器的角度不同,使用const-ness进行重载函数参数不允许。

前者是可能的,因为,
如果您有一个const对象,那么您只能在其上调用const函数。因为非const函数必然会修改类成员,因此在const对象上调用它是一个语义错误,会导致编译错误。

如果你有一个普通的on-const对象,那么函数的const和非const版本都可以在实例上调用。编译器选择最合适的非const版本。