这篇笔记主要是关于 C++ 中常见的函数以及相关的知识点。
基本知识
要使用一个 C++ 函数,必须完成以下三个工作:
提供函数的定义(Definition)
提供函数的原型(Prototype)
调用该函数(Reference / Call)
定义函数
没有返回值的函数被称为 void 函数,可以没有return,所以有时也会被称为过程或者子程序。有返回值的函数则必须要有 return。
void FunctionName (paramList) {
statements;
return; // optional
}
int FunctionNameAnother (paramList) {
statements;
return 0; // must return an int
}
参数列表 paramList 中,每个参数都必须要指明其类型。
通常,函数通过将返回值复制到指定的 CPU 寄存器(Register)或内存单元中来将其返回。
函数原型
C++ 要求给函数提供它的原型。因此,我们要了解这背后的原因,以及如何提供原型。
原因
原型将函数返回值的类型和参数的类型、数量告诉了编译器。如果让编译器在每次使用函数的时候就全文查找,可能效率不高,因为它必须从 main() 中跳出。而且函数可能根本不在文件内,C++ 允许将一个程序放在多个文件中,单独编译这些文件然后再将它们组合起来。在这种情况下,编译器在编译main() 时,可能还无权访问这些函数代码,所以我们会希望有函数原型提供这些信息。
语法
基本上,只要将函数实现的花括号部分整个删除改成分号即可。在函数原型中,参数的名字不重要,甚至可以不写。
// prototype
double Volume(int h, int w, int d);
// or double volume(int, int, int);
// definition
double Volume(int h, int w, int d) {
return h * w * d;
}
按值传递
C++ 通常按值传递,意思是它会在函数运行时创建新的变量,用来存传进来的参数。这样,传进来的参数本身不会受到函数语句的影响。
在函数中声明的变量是私有的。函数被调用时,计算机将为这些变量分配内存,在函数结束时,计算机将释放这些变量使用的内存。
函数指针
内联函数
重载
模板