c++基础知识整理二

本文介绍了C++的基础知识,包括按引用传递参数、函数参数的默认值、函数重载的概念、内联函数的使用以及递归函数在计算阶乘中的应用。通过实例详细阐述了这些概念,帮助读者理解C++编程中的关键要素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:用地址符 ampersand (&)来声明按地址"by reference"传递参数的方式只是在 C++中适用。在 C 语言中,我们必须用指针(pointers)来做相同的操作。

2:

参数的默认值(Default values in arguments)

当声明一个函数的时候我们可以给每一个参数指定一个默认值。如果当函数被调用时没
有给出该参数的值,那么这个默认值将被使用。指定参数默认值只需要在函数声明时把
一个数值赋给参数。如果函数被调用时没有数值传递给该参数,那么默认值将被使用。
但如果有指定的数值传递给参数,那么默认值将被指定的数值取代。例如:

// default values in functions 6#include <iostream.h> 5int 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)

只有一个参数被指明,但函数 divide 允许有两个参数。因此函数 divide 假设第二个参数的值为 2,因为我们已经定义了它为该参数缺省的默认值(注意函数声明中的 int b=2)。因此这次函数调用的结果是 6 (12/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)

inline 指令可以被放在函数声明之前,要求该函数必须在被调用的地方以代码形式被编译。这相当于一个宏定义(macro)。它的好处只对短小的函数有效,这种情况下因为避免了调用函数的一些常规操作的时间(overhead),如参数堆栈操作的时间,所以编译结果的运行代码会更快一些。

它的声明形式是:
inline type name ( arguments ... ) { instructions ... }

它的调用和其他的函数调用一样。调用函数的时候并不需要写关键字 inline ,只有在函数声明前需要写。

5:

递归(Recursivity)

递归(recursivity)指函数将被自己调用的特点。它对排序(sorting)和阶乘(factorial)

运算很有用。例如要获得一个数字 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),当参数到达 0 的时候,函数不继续用负数乘下去(最终可能导致运行时的堆栈溢出错误(stack overflowerror)。

这个函数有一定的局限性,为简单起见,函数设计中使用的数据类型为长整型(long)。在实际的标准系统中,长整型 long 无法存储 12!以上的阶乘值。


6:待续










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值