带有const参数和重载的函数
尝试了stackeroverflow qn所以它让我思考为什么不重载的function,我想出了一个稍微不同的代码,但它说,该function不能超载。 我的问题是为什么? 还是有另一种方式?
#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; }
不能仅仅基于非指针,非引用types的常量来重载。
例如,如果你是编译器。 面对的路线:
cout <<obj.foo(3);
你打哪个function?
当你通过价值传递的价值被复制的方式。 参数上的const只与函数定义有关。
§13.1标准讨论关于不能重载状态的声明 –
只有const和/或volatile存在或不存在的参数声明才是相同的。 也就是说,每个参数types的const和volatiletypes说明符被忽略 […]
只有参数types规范最外层的const和volatiletypes说明符才会被忽略; 隐藏在参数types规范中的const和volatiletypes说明符是重要的,可以用来区分重载的函数声明。 […]
当确定哪个函数被声明,定义或调用时。 “特别是,对于任何typesT,”指向T的指针“,”指向常量T的指针“和”指向易失性的T“都被认为是不同的参数types,如”对T的引用“,”对const T的引用“和“提到易变的T.”
编辑2:
由于post基本上是相同的作为职位 ,除了重载函数现在是类成员函数,我想说明一个额外的方面,可能是有用的,说明重载的概念是不一样的重载基于参数的“常量”(在类范围或命名空间范围内)。 然而,OP想要知道如何区分这两种过载。
如图所示,在成员函数调用的情况下,成功重载它们的方法依赖于隐含的第一个参数的cv限定。 当用于调用重载成员函数的对象expression式也是一个const时,只能调用“const”成员函数。 当使用非const对象expression式来调用重载成员函数调用时,非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; }
正如对另一个问题的答案所解释的那样,这两个foo
没有区别,因为它们具有相同的参数定义。