c++基础知识整理二
通过地址符 & 来声明按 address 传递参数的方式仅限于 C++ 中适用。在 C 语言中,则必须使用 pointer 指针来实现相同功能。
2:
参数的默认值(Default values in arguments)
当声明一个函数的时候我们可以给每一个参数指定一个默认值。如果当函数被调用时没
有给出该参数的值,那么这个默认值将被使用。指定参数默认值只需要在函数声明时把
一个数值赋给参数。如果函数被调用时没有数值传递给该参数,那么默认值将被使用。
但如果有指定的数值传递给参数,那么默认值将被指定的数值取代。例如:
// 默认值在函数中
#include <iostream.h>
int divide(int a, int b = 2) {
int r;
r=a/b;
return (r);
}
int main () {
cout << divide (12);
cout << endl;
cout << divide (20,4);
return 0;
}
我们可以看到在程序中有两次调用函数 divide。第一次调用:
divide (12)
Only one parameter is explicitly specified, but the function divide is capable of accepting two parameters. Therefore, the function divide assumes that the second parameter's value is 2 because it has been defined as the default value for this parameter (as seen in the function declaration int b = 2). Thus, the result of this function call is calculated to be 6 (i.e., 12 divided by the default second parameter value of 2).
在第二次调用中:divide (20,4)
当有两个参数时,在编程中,默认值(int b=2)将被传入的参数值4替代,导致最终计算结果为5(即20除以4)。
3:
函数重载(Overloaded functions)
两个不同的函数可以使用相同的名称,在其参数(arguments)模型(prototype)不同时。换句话说,你可以将同一个名称分配给多个函数,在这些情况下:它们使用不同的参数数量或类型。例如,在以下情况下:该方法具有显著的效果。
// overloaded function 2#include <iostream.h> 2.5
int divide (int a, int b) {
return (a/b);
}
float divide (float a, float b) {
return (a/b);
}
int main () {
int x=5,y=2;
float n=5.0,m=2.0;
cout << divide (x,y);
cout << "\n";
cout << divide (n,m);
cout << "\n";
return 0;
}
在这一实例中,我们以同一名称定义了两种不同的功能模块;其中一个是接收并处理两位整数值(int)数据的功能模块、另一个则是接收并处理两位浮点值(float)数据的功能模块。程序编译器(compiler)会根据传递给这些功能模块的实际数据类型来决定具体采用哪个功能模块进行操作:当传递的数据均为整数值时,则会激活并执行具有两位整数值(int)参量的功能模块;而当传递的数据均为浮点值时,则会激活并执行具有两位浮点值(float)参量的功能模块。
为了简单起见,这里我们用的两个函数的代码相同,但这并不是必须的。你可以让两个
函数用同一个名字同时完成完全不同的操作。
4:
Inline 函数(inline functions)
该指令可以在函数声明前使用。然而,在调用时必须将该函数以代码形式进行编译。这实际上相当于一个宏定义(macro)。其优点主要适用于简短的函数——这种优势主要适用于简短的函数。由于避免了调用函数时的一些常规操作所需的时间(overhead),如参数堆栈操作的时间等。因此,在这种情况下,生成的编译后代码运行速度更快一些。
它的声明形式是:
inline type name ( arguments ... ) { instructions ... }
其调用方式与其它函数调用类似。不需要在调用时使用 inline 关键字,而必须在其声明之前进行设置.
5:
递归(Recursivity)
递归性(recursivity)是指函数在其自身内部调用所带来的特性。这种特性在排序问题(sorting)以及阶乘计算(factorial computation)中得到了广泛应用。
计算功能非常强大。例如要获得一个数字 n 的阶乘,它的数学公式是:n! = n * (n-1) * (n-2) * (n-3) ... * 1
举个例子说明一下,5! (factorial of 5) 是:
5! = 5 * 4 * 3 * 2 * 1 = 120而用一个递归函数来实现这个运算可以用以下代码:
// factorial calculator
#include <iostream.h>
Type a number: 9
!9 = 362880
long factorial (long a){
if (a > 1) return (a * factorial (a-1));
else return (1);
}
int main () {
long l;
cout << "Type a number: ";
cin >> l;
cout << "!" << l << " = " << factorial (l);
return 0;
}
在函数 factorial 中, 我们是如何调用自身的?答案是只有在参数值超过 1 的情况下才会触发递归操作。如果忽略这一条件, 函数将陷入无限递归(an infinite recursive loop)。一旦参数达到零, 函数将停止递归以避免负数运算(这可能导致运行时的堆栈溢出错误)
该函数存在明显的限制。为了简化操作,在函数的设计过程中,默认采用长整型数据类型(long)。而在标准系统的实际情况中,当数值超过12!时,使用long类型的变量将无法正确表示相应的阶乘值。
6:待续
