aihot  2020-11-12 09:24:52  OpenCV |   查看评论   

 C++的那些事:函数全解析

一、函数的结构

函数在C++中可能出现在三种地方,一是函数的定义,它包括了如上图的结构;二是函数的声明,它与函数的定义相比,没有了函数体部分;三则是函数的调用。当然,不同的函数定义可以还会稍有不同,比如类的成员函数、内联函数等。这里我们主要讨论函数的调用时需要注意的一些问题。

C++的那些事:函数全解析

 

二、参数传递

我们将函数定义或声明里的参数叫形参,而在调用函数时传入的参数叫实参。那么根据形参类型的不同,有几下形式的参数传递。

1,非引用形参

1)普通的内置类型

普通非引用类型的参数通过复制对应的实参实现形参的初始化。当用实参的副本初始化形参时,函数并没有访问调用所传递的实参的本身,因此函数不可能改实参的值。比如下面的交换两个数的:

void swap(int v1, int v2) {     int temp = v1;     v2 = v1;     v1 = temp; }  swap(a, b);// 调用swap

上面程序中,实参为a与b,但是在调用时,v1与v2接受的是a与b的副本,所以实际上a与b的值没有变化。

2)指针形参

函数的形参可以是指针,此时将复制实参指针,其实这类跟1)原理类似,函数内并无法改变实参的指针值。只是函数可以通过复制到的地址改变实参指针所指向的值。

void swap(int* v1, int* v2) {     int temp = *v2;     *v2 = *v1;     *v1 = temp; } int main() {     int a = 10,b = 20;     int *p1 = &a,*p2 = &b;     swap(p1,p2);     return 0; }

上面程序中定义的swap的形参为指针类型,main中调用swap,实际上swap并不能改变p1与p2的值,只是改变了它们所指向的值。

3)const 形参

对于普通的非引用类型用const修饰实际上是没有意义的,因为本来函数就不会改变实参的值。像下面的定义,实际中编译器会忽略const的定义,而将其视为int型。

void fcn(const int i);

2,引用形参

1)在上面的程序中我们看到,如果想交换两个变量的值,通过调用普通的非引用类型形参的函数,并不能实现。用它们的指针可以,同时我们也可以用引用。

void swap(int& v1, int& v2) {     int temp = v2;     v2 = v1;     v1 = temp; } int main() {     int a = 10,b = 20;     swap(a,b);     return 0; }

在实际调用swap时,v1与v2实际相当于a与b的另一个名字。

 1/6    1 2 3 4 5 6 下一页 尾页
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:函数全解析

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]