我之前学习c++,主要的学习方法是看教学视频,视频里讲的,听了之后就明白了,也会跟着一步步敲代码,也能照着例子敲一些练习题,敲完之后感觉自己懂了,但是实际上,那只是自以为是而已,其实自己懂的,只是皮毛中的毛,要想正真地理解,需要结合自己知道的信息,进行深入思考,不仅知其然,更要知其所以然。
记起来之前一个老师说的,学习c++,要站在开发c++的那帮大牛们的角度去思考问题。他们设计的每一种语法特性,不一定是最优的,但一定是有其应用场景的。拿函数的重载来说,对于开发了c++语言的开发者来讲,目的就是增加语言的灵活性,让使用c++做开发的人能够更方便快捷地设计程序,而我们作为c++的应用者,利用函数重载的特性去设计函数,满足我们在调用该函数时候的各种需求。
举例来讲,我们设计了一个求和函数:
int sum(int a,int b)
{
return a+b;
}
调用这个函数的时候,传入的参数的类型只能是两个int型,那如果要对两个double类型数据求和呢?当然可以再设计个函数,可以叫做sum_double(double a,double b),但这样对于设计函数的时候起函数名和调用函数的时候记函数名,都是一种负担,一种更好的解决方案就是重载,把完成一样的功能,只是参数类型或个数不同的函数命成一样的名字,调用的时候只要记住一个名字,传入参数就可以了,把区分调哪个函数的工作交给编译器帮我们完成就ok了。
以上,理解了函数重载的应用场景,但在与其他知识结合的实际应用中,还有很多具体的问题需要明确,对于这些问题就需要长期积累了,忍不住又要背《劝学》了:不积跬步无以至千里,不积小流无以成江海,骐骥一跃,不能十步,驽马十驾,功在不舍、、、、、、——我就是驽马
以下,对于函数重载混合其他知识在实际应用中的问题总结一些
<1>
void setAge(int age){}
void setAge(int){}
这两个函数的参数类型是一样的,只是第二个省略了而已
<2>
void setAge(int age){}
void setAge(int &age){}
这两个函数的参数数据类型不同,是重载,但是在调用的时候,如果是
int main()
{
int age=10;
setAge(age);
return 0;
}
就会产生二义性,编译器不知道该调哪个setAge
而
int main()
{
setAge(10);
return 0;
}
可以调到setAge(int age),那要怎么调用到setAge(int &age)呢?(知道了再补充)
<3>
void setAge(int age)
{
}
void setAge(const int age)
{
}
这两个函数在编译时候会报错: 函数“void setAge(int)”已有主体,这里涉及到“顶层const”的概念(再总结一篇然后把地址贴到这里),顶层const不影响传入函数的对象。