这篇文章将为大家详细讲解有关如何在c++中使用常量实现函数重载,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>成员函数强>
声明:& lt;类型标志符祝辞函数名(参数表)常量;
说明:
(1)常量是函数类型的一部分,在实现部分也要带该关键字。
(2) const关键字可以用于对重载函数的区分。
(3)常成员函数不能更新类的成员变量,也不能调用该类中没有用常量修饰的成员函数,只能调用常成员函数。
(4)非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数。
重载看例子:
# include, using namespace 性病, class Test {, 保护: int 才能,x,, 公众: Test 才能;(int 我):x (i), {,}, void 才能;有趣的(),const ,{大敌; ,,,cout & lt; & lt;,“有趣的(),const nbsp;“, & lt; & lt;, endl;, ,,}, void 才能;有趣的(), ,{大敌; ,,,cout & lt; & lt;,“有趣的(),nbsp;“, & lt; & lt;, endl;, ,,}, },, int main (), {, Test 才能;t1 (10),, const 才能;Test  t2 (20),, t1.fun才能(),, t2.fun才能(),, ,,return 0; }
结果为:
const修饰成员函数时的重载
分两种情况,一种情况下不允许重载,另一种允许。还是直接看例子吧:
# include, using namespace 性病, void 乐趣(const int 我), {, cout 才能;& lt; & lt;,“有趣(const int), nbsp;“, }, void 乐趣(int 我), {, cout 才能;& lt; & lt;,“有趣(int ), nbsp;“,,,, }, int main (), {, const 才能;int 小姐:=,10;, 乐趣才能(i),, ,,return 0; }
结果:编译错误,提示重定义:
其实很好理解:
void (int )和乐趣 void 乐趣(const int );
实际上没有区别,因为函数调用的时候,存在形实结合的过程,所以不管有没有常量都不会改变实参的值。
但是看下面的情况:
# include, using namespace 性病, void 乐趣(char *), {, ,cout & lt; & lt;“non-const 有趣的(),“,& lt; & lt;,,, }, void 有趣(const char *), {, ,cout & lt; & lt;“const 有趣的(),“,& lt; & lt;,,, }, int main (), {, ,const char * ptr =,“hello world",, ,有趣的(ptr); ,return 0; }
结果:通过编译,且输出结果为:
很奇怪是吗,这种情况和上面的情况难道不一样吗?
先别急,再来看一个例子。然后再解释。
# include, using namespace 性病, void 乐趣(char *), {, ,cout & lt; & lt;“non-const 有趣的(),“,& lt; & lt;,,, }, void 乐趣(char *, const a), {, ,cout & lt; & lt;“const 有趣的(),“,& lt; & lt;,,, }, int main (), {, ,char ptr [],=,“hello world",, ,有趣的(ptr); ,return 0; }
结果:编译不通过,提示重定义:
好了,现在解释原因。
第一个例子中,我们说,乐趣(int i)和乐趣(const int i)是一样的,是因为函数调用中存在实参和形参的结合。加入我们用的实参是int,那么这两个函数都不会改变一个的值,这两个函数对于一个来说是没有任何区别的,所以不能通过编译,提示重定义。
好了,那<代码>乐趣(char *)和乐趣(const char *) 代码>是一样的吗?答案是:不一样,因为char *中一个指向的是一个字符串变量,而const char *一指向的是一个字符串常量,所以当参数为字符串常量时,调用第二个函数,而当函数是字符串变量时,调用第一个函数。