我只是想知道在进行函数调用时有哪些决定性因素
超载。我知道它的参数签名,传递的参数数量
其中起着重要作用。但是还有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对象的情况下,第二个函数被调用。那很好。但如果我写第一和第三功能,它就成了一个问题。为什么这样?
答案 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版本。