试试the stackeroverflow qn所以它让我思考为什么不重载该函数,我想出了一个略有不同的代码,但它说该函数不能重载。我的问题是为什么?还是有另一种方式?
#include <iostream>
using std::cout;
class Test {
public:
Test(){ }
int foo (const int) const;
int foo (int );
};
int main ()
{
Test obj;
Test const obj1;
int variable=0;
do{
obj.foo(3); // Call the const function
obj.foo(variable); // Want to make it call the non const function
variable++;
usleep (2000000);
}while(1);
}
int Test::foo(int a)
{
cout<<"NON CONST"<<std::endl;
a++;
return a;
}
int Test::foo (const int a) const
{
cout<<"CONST"<<std::endl;
return a;
}
答案 0 :(得分:20)
您不能仅基于非指针,非引用类型的常量进行重载。
例如,如果您是编译器,请考虑一下。 面对这条线:
cout <<obj.foo(3);
你会打电话给哪个职能?
当您通过值传递时,值会以任一方式复制。参数上的const仅与函数定义有关。
答案 1 :(得分:15)
§13.1标准讨论了无法重载的声明 -
不同的参数声明 只有在有或没有的情况下 const和/或volatile是等价的。 也就是说,const和volatile 每个参数的类型说明符 类型被忽略 [...]
只有const和volatile 最外层的类型说明符 参数类型规范 被这种方式忽略了;常数和 埋藏在其中的易失性类型说明符 参数类型规范是 重要的,可以用来 区分重载功能 声明。 [...]
确定哪个功能时 被声明,定义或调用。 “特别是对于任何类型的T, “指向T的指针”,“指向const T的指针” 和“指向易失性T的指针” 考虑不同的参数类型, 和“参考T”,“参考 const T,“和”引用volatile T“。
编辑2:
由于帖子基本上与reffered post相同,除了重载函数现在是类成员函数之外,我试图说明一个额外的方面,可用于说明重载的概念,而不是与基于参数的'constness'的重载相同(在类范围或命名空间范围内)。然而,OP想知道如何区分这两个重载。
如果成员函数调用如图所示,成功重载它们的方法依赖于隐含的第一个参数的cv限定。只有在用于调用重载成员函数的对象表达式也是const时,才能调用'const'成员函数。当非const对象表达式用于调用重载的成员函数调用时,非const版本是首选的,因为它是完全匹配(对const成员函数重载的调用将需要第一个隐含参数的cv限定)
#include <iostream>
using std::cout;
class Test {
public:
Test(){}
int foo (const int) const;
int foo (int );
};
int main ()
{
Test obj;
Test const objc; // const object
obj.foo(3); // calls non const overload, object expression obj is non const
objc.foo(3); // calls const overload, object expression objc is const
}
int Test::foo(int a)
{
a++;
return a;
}
int Test::foo (const int a) const
{
return a;
}
答案 2 :(得分:1)
正如另一个问题的答案所解释的那样,两个foo
没有区别,因为它们具有相同的参数定义。