函数
函数:程序的功能模块。
1. 函数定义与调用
1.1 函数定义
类型 函数名(形参表){
语句序列
}
1.1.1 形式参数
(type1 name1,type2 name2,...,typen namen)
其中type为参数类型,name为参数名。形参的的作用是实现主调函数与被调函数之间的联系。函数在没有被调用时时静止的,此时的形参只是一个符号,它限制了对应形参数据的类型。在函数被被调用时,形参才被主调函数的实参赋值。
1.1.2 函数的返回值和返回类型
函数的返回值由return语句给出(格式为:return 表达式;
),返回值类型有函数定义确定。函数也可以没有返回值,此时类型用void
,返回值既可以没有返回语句,也可以return ;
1.2 函数调用
1.2.1 函数的调用形式
在函数调用前,必须要有函数原型声明(函数定义也属于函数的声明),而函数的定义(实现),可以在调用代码前,也可以在调用代码之后。函数声明形式如下:
类型 函数名(形参表);
在声明了函数原型之后,便可以按如下形式调用函数:
函数名(实参表);
1.2.2 函数的嵌套调用和递归调用
嵌套调用:函数内部语句有函数调用。
递归调用:函数直接或间接的调用了自身。递归调用的过程一般分为递推和回归两步。
1.3 函数的参数传递
在函数未被调用时,函数的形参并不占有实际的内存空,也没有实际的值。只有在函数被调用时才给形参分配存储单元,并将实参和形参结合。结合方式有值传递和引用传递。
值传递:是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参。这一过程使参数的单向传递过程,也就是说在函数内部无论形参发生了什么改变,都不会形象函数外的实参的值。
引用传递:引用是变量的别名(在声明一个引用时,必须同时初始化,使它指向一个已存在的对象,且初始化后,不能改变其指向。在函数声明的形参,初始化在函数传参时。也就是说引用的初始化,是在第一次执行该语句时,因为函数外的声明语句会被立马执行,而函数的声明不会立马执行。)引用传递因为是直接操作实参对象,所以函数内的改变会影响函数外的值。
补充:为了编写能处理不同数量的实参函数,
C++
标准直蹦提供了两种主要的方法。如果所有的实参类型相同,可以传递一个名为initializer_list
的标准库类型;如果是实参类型不同,可以编写可变参数模板的类。
1.4 内联函数
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。内联函数的定义形式如下:
inline 类型 函数名(形参表){
语句序列
}
注意: inline只是一个建议,编译器会自主判定是否作为内联函数(编译时拷贝代码)。
1.5 constexpr函数
顾名思义constexpr(const expression)常量表达式。constexpr
修饰的函数在其所有的参数都是常量表达式时,一定返回常量表达式,且函数体有且仅有一条return
语句。
例如:
constexpr int len(const int arg){
return 4 * arg;
}
1.6 带默认参数的函数
函数在定义时可以预先声明默认的形参值。如果在调用时,若没有传入相应实参,形参采用默认值。c++
中规定,函数形参中的默认参数必须放在形参表的最后。
例如:
int add(int x=0,int y=0){
return x + y ;
}
1.7 函数重载
c++
允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。两个以上的函数,具有相同的函数名,但形参的个数或者类型不同,编译器更具实参和形参的类型及个数的最佳匹配,自动确定使用哪一个函数。 重载函数的形参必须不同。
例如:
int add(int x,int y);
float add(float x,float y}; //形参类型不同
int add(int x, int y, int z); //形参个数不同
float add(int x, int y, float z); //形参类型和个数不同
//
1.8 C++标准库
联系邮箱: antarm@outlook.com