具有const参数和重载的函数

时间:2010-09-10 03:16:53

标签: c++ class const overloading

试试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;
 }

3 个答案:

答案 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没有区别,因为它们具有相同的参数定义。