[C++]基础知识---函数


写在前面:
在刚上大学的时候,学习各种各样的计算机基础知识,对我而言,刚开的时候我是不理解的,知识太抽象,只是机械的记住了概念和用法,往往忽略了一些细节。
当自己实践增多的时候,各种知识渐渐的清晰起来,所有东西都是有来龙去脉的,原来不理解的东西都豁然开朗起来。这个时候再取回顾原来学习的知识技能,又有一种温故而知新的感觉。因为我打算开始慢慢复习之前学习的基础知识,这也算是我开始夯实基础的一个开篇吧!

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 签名

猜你喜欢

转载自blog.csdn.net/wayway0554/article/details/79782030