写在前面:
在刚上大学的时候,学习各种各样的计算机基础知识,对我而言,刚开的时候我是不理解的,知识太抽象,只是机械的记住了概念和用法,往往忽略了一些细节。
当自己实践增多的时候,各种知识渐渐的清晰起来,所有东西都是有来龙去脉的,原来不理解的东西都豁然开朗起来。这个时候再取回顾原来学习的知识技能,又有一种温故而知新的感觉。因为我打算开始慢慢复习之前学习的基础知识,这也算是我开始夯实基础的一个开篇吧!
1、函数原型
int test(int x,float y)
{
return x;
}
- C++的函数必须指定返回类型,不像C有默认的返回类型
- 如果没有参数的话,参数列表可以为空,而C没有参数的时候,必须写上void
2、引用
用 & 符号来标记,给存储器别名
int x;
int& ref=x;
ref = 3;
//此时x为3
引用和指针的有些类似,只不过引用可以直接赋值,而指针要转化一下,如
int* p;
p = new int;
*p=3;
//ref可以直接赋值
int x;
int& ref=x;
ref = 3;
3、引用调用
swap(int& x,int& y)
{
int t=x;
x=y;
y=t;
}
当调用时,会将x和y的互换,如
int x=5;
int y=7;
swap(x,y);
//此时x=7,y=5
C++默认的方式就传值调用,传入的参数会被拷贝一个副本出来,对这个副本进行操作而传入的变量不会发生改变,如
swap(int x,int y)
{
int t=x;
x=y;
y=t;
}
int x=5;
int y=7;
swap(x,y);
//此时x还是等于5,y还是等于7
4、引用返回
int& test(int& result)
{
result++;
return result;
}
int a=5;
++test(a);
cout<<a;
//a的结果为7
返回的时变量本身,例如以上的例子,传入的时a本身,a的值加一后返回,返回的也是a的实体,所以++test(a)相当于++a,所以结果是7.
注意:不要返回局部变量,因为函数里局部变量再函数执行完毕后,会被释放,返回局部变量会发生错误!
5、函数默认参数
int test(float j,int i=0)
{
//do something
}
test(5.5,1);
test(5.5);
有默认参数的变量要放在后面,没有默认值的变量放在前面!
6、函数重载
bool isMax(int x,int y)
{
return x>y;
}
bool isMax(float x,float y)
{
return x>y;
}
bool isMax(double x,double y)
{
return x>y;
}
重载的概念是对于同名函数来说的,允许函数名称相同,这样的好处其实是方便调用,不用根据数据类型来调用函数了,同样的函数名可以处理不同的数据,因为C语言里没有重载的概念,所以可能会出现:
isMax_int;
isMax_float;
isMax_double;
......
这样多难受,而C++只要isMax就能搞定所有,最终我们会根据函数的参数类型、个数、顺序来区别这些同名的函数,这其实就是函数的签名就是下个问题了。
7、函数签名
函数签名保证了函数的唯一性,对于重载来说因为函数名一样,所以靠以下的第二点来区分
* 函数名
* 函数参数的个数、类型、顺序
F();
G();
//名称不同
F();
F(int a);
//参数个数不同
F(int a);
F(float a);
//类型不同
F(int a,float b);
F(float a,int b);
//顺序不同
8、内联函数
inline void test(int a,int b)
{
cout<<a<<b;
}
int main()
{
test(5,4);
return 0;
}
在执行test(5,4)的时候,不会去做函数调用操作,因为编译器相当于将test实现的代码替换了调用那一行的代码。好处是减小了调用开销,但是程序的大小会膨胀,因为内联函数会替换所有调用此函数的地方,有时候编译器会因为一些原因不能去扩展这样的请求,所以应该还是要看编译器的情况吧。
8、专业术语部分
- Function Prototype 函数原型
- Reference 引用
- Call by Reference 引用调用
- Call by Value 传值调用
- Return by Reference 引用返回
- Return by Value 传值返回
- Overload 重载
- Signature 签名