您的位置:首页 > 博客中心 > 编程语言 >

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

时间:2022-03-25 06:21

技术分享 

主函数简单的就写成这样。19、20行结果可以看书p指向n的地址,q指向i的地址。26行修改了n的值。那么关键来啦!37行i变成了0,那么我们再看看40行发生了什么。对的,p的值并没有变成0而是和输入的时候一样,但是*p,也就是p指向的值变成了0。

所以,我们需要用过形参修改实参的值是可以用指针形参的方法来做,但是形参的指针是一个新的指针,它指向的值和实参是一样的。

如果我们想要修改实参的值,最简单的办法就是引用调用了,因为引用就是实参的别名,可以把它就看成形参,想怎么弄就怎么弄。

引用主要的优点有两个:1、避免拷贝,可以节省许多空间,特别是在传递字符串的时候。2、使用引用形参返回额外信息。因为C++中函数只能返回一个值,当你需要返回很多值的时候,引用可以很好的解决这个问题。

引用做起来十分简单,只要你记住它就是实实参,它就是实参,它就是实参,重要的事情说三遍。

 

数组形参,由于数组不能拷贝并且我们使用数组的时候通常会转化成指针。因此我们无法以值传递的方式使用参数数组。我们为函数传递一个数组时,实际上传递的使指向数组首元素的指针。一般来说,指针数组会写成下面几个形式:

1 void fun(const int *);
2 
3 void fun(const int []);
4 
5 void fun(const int [10]);

 

 

由于数组是右指针形式传递给函数的,所以一开始函数并不知道数组的尺寸,管理指数形参通常有三种技术:

1、标记指定数组长度。简单的说就是在数组结尾的时候加一个标记,然后计算标记前有多少个数,这种用起来好麻烦。

2、显示传递一个表示数组大小的形参。把数组大小做为形参传递,这种方法比较常用。

3、数组引用形参。在此之前我很少碰到有这种方法的。就是对数组做一个引用,在这里mark一下:void fun(int (&arr)[10]);

 

另外在准备一些知识性的东西:

主函数一般都张这样:

int _tmain(int argc, _TCHAR* argv[])

其中argc是输入参数的个数,argv[]是字符串。例如,我们输入:test.exe hello。argc=2, argv[0]=”text.exe”,argv[1]=”hello”;

 

二、返回类型和return语句

return语句终止当前正在执行的函数,并将控制权返回调用该函数的地方。

返回一个值的方式和初始化一个变量或形参的方式完全一样,返回的值用于初始化调用点的一个临时量,该临时梁就是函数调用的结果。

注意:请不要返回局部对象的引用或者指针。因为函数完成后它所占用的存储空间将会被释放掉,也就是说意味着局部变量的引用将指向不在有效的区域。

递归函数,是一种很特殊的函数,它自己调用了自己,例如我们阶乘:

 1 int factorial(int val)
 2 
 3 {
 4 
 5 if(val>1)
 6 
 7 return factorial((val-1))*val;
 8 
 9 else 
10 
11 return 1;
12 
13 }

 

递归函数需要有一个出口,否则将永远的递归下去。递归函数有时会简化我们的编程思路,但是如果递归层数太多会爆栈。一般刚刚学习的时候觉得能写递归程序简直牛逼的不行,但是实际操作中能不用递归尽量不要用递归,一般都用“栈”来替代递归。

返回数组指针。一般人都不会这么干吧,因为数组不能被拷贝,所以不能返回数组,但是可以返回数组指针或引用,如下给出,不再详述。

int (*func(int i))[10];

 

三、函数重载

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的(指参数的个数、类型或者顺序)必须不同,也就是说用同一个完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

如我们写文件的时候,数据不同,但是完成同样的功能:

void writeFile(char *cMaskName,char* pAllMask);

void writeFile(char *cName,short* pAllMask);

 

调用的时候编译器会根据不同的参数类型选择最匹配的函数来调用,如果匹配出现错误和二义性会报错。具体可以参见这篇文章,写的非常的详细:

 

四、默认实参

某些函数有这样一种形成,在很多次调用的时候都被赋予相同一个值,此时我们把这个反复出现的值成为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。函数调用时参数按期位置解析,默认实参负责条目函数调用缺少的尾部实参。

 

五、内联函数

内联函数在前面的博客里面写过,这种函数只要的用途是可以提高程序的效率,但是会比较占内存。http://www.cnblogs.com/Dr-XLJ/p/4485424.html,当然了,内联函数这篇是抄的。

 

六、调试帮助

我认为这部分是非常的有用的,在写程序的时候想看看结果总是各种printf,然后交付的时候各种注释,超级麻烦。

具体做法是这样的:

技术分享 

如果我们没有定义NDEBUG,那么会执行16行内容,如果定义了NDEBUG就不会执行。

另外,预处理器定义了许多类似于“__FUNCDNAME__”的很有用的名字,对调试起到帮助。

 

七、函数指针

函数这个部分内容比较多,但是马上快完了。最后看看函数指针。

函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定的类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。所以我们可以用同一个函数类型的函数指针指向不同名字的函数。

另外,我们不能把函数当做形参来调用,但是可以把函数指针当做形参来做。具体我们做一个简单的小例子:

 

int add(int a,int b){return a+b;}

int sub(int a,int b){return a-b;}

int mul(int a,int b){return a*b;}

void show(int (*p)(int a,int b),int a,int b)

{

cout<<p(a,b)<<endl;
return;

}

int _tmain(int argc, _TCHAR* argv[])

{

int (*p)(int a,int b)=0;
int a=5,b=3;
 
p=add;
show(p,a,b);

p=sub;
show(p,a,b);
 
p=mul;
show(p,a,b);

}

 

 

技术分享 

定义了三个同样类型的函数add,sub,mul,加、减、乘。然后定义了一个含有指针函数形参的show函数用于显示计算的结果。高光的部分需要注意,第一个是函数指针作为形参的写法,第二个是函数指针的声明方法。我们分别把函数指针指向add,sub,mul,调用show函数发现显示出了不同的结果。

函数的指针在编程中是个非常有用的方法,不要害怕,多用用就OK了。

 

本次内容略多,不能只靠看理论就能掌握,需要在实践中多运用才能熟练的使用和掌握,写出漂亮的代码。

 

本类排行

今日推荐

热门手游