c++基础(四)

函数

函数:定义好的、可重用的功能模块

定义函数:将一个模块的算法用C++描述出来

函数名:功能模块的名字

函数的参数:计算所需要的数据和条件

函数的返回值:需要返回的计算结果

函数定义的语法形式

类型标识符 函数名 (形式参数表)

{

语句序列

}

调用函数需要先声明函数原型

若函数定义在调用点之前,可以不另外声明;

若函数定义在调用点之后,必须要在调用函数前声明函数原型:

函数原型:类型标识符 被调用函数名(含类型说明的形参表)

函数调用形式

函数名(实参列表)

嵌套调用

 

嵌套调用:在一个函数的函数体中,调用另一函数。

3-1编写一个求xn次方的函数

#include <iostream>

using namespace std;

//计算x的n次方

double power(double x, int n) {

double val = 1.0;

while (n--) val *= x;

return val;

}

int main() {

cout << "5 to the power 2 is "
<< power(5, 2) << endl;

return 0;

}

函数的参数传递

函数的形参在函数被调用时才被分配存储空间,实参可以是常量、变量和表达式。实参的类型需要和形参一致,当实参类型和形参类型不一致时,编译器会尝试进行类型转换,如果类型转换是不合法的,那么编译器将会报错。在传递参数的时候,有值传递和引用传递两种方式。值传递是数据的单向传递,不会影响到传入的实参;引用传递是数据的双向传递,形参中发生的改变会直接反映到实参中,事实上,引用传递时实参和形参是共用存储空间的,即是对同一份数据进行访问和操作。相比于值传递,引用传递的效率会更高,当我们希望效率高而同时不希望实参发生改变时,我们需要使用常引用,常引用只允许对实参进行访问,而不能改变实参。

       定义一个引用时,需要对其进行初始化,让其指向一个已经存在的对象;一旦一个引用被初始化后,就不能再指向其他对象;引用常被作为函数参数被传递。

含有可变参数的函数

      C++提供了两种主要的方法:当所有的形参类型相同时,可以传递一个名为initializer_list的标准库类型,用于表示某种特定类型的值的数组,它包含在同名的头文件中;当形参类型不同时,我们可以编写可变参数的模板。

 

initializer_list的使用方法

initializer_list是一个类模板,使用模板时,我们需要在后面跟一对尖括号,括号内给出参数类型;initializer_list内的参数永远是常量,无法对其中的元素作出更改;含有initializer_list的函数也可以拥有其他参数。

内联函数

声明时使用关键字 inline。编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。

注意:内联函数体内不能有循环语句和switch语句;内联函数的定义必须出现在内联函数第一次被调用之前;对内联函数不能进行异常接口声明。

constexpr函数语法规定

constexpr修饰的函数在其所有参数都是constexpr时,一定返回constexpr;函数体中必须有且仅有一条return语句。

constexpr函数举例

constexpr int get_size() { return 20; }

constexpr int foo = get_size();  //正确:foo是一个常量表达式

带默认参数值的函数

可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值。

例:

int add(int x = 5,int y = 6) {

     return x + y;

}

int main() {

     add(10,20);  //10+20

     add(10);     //10+6

     add();       //5+6

}

默认参数值的说明次序

有默认参数的形参必须列在形参列表的最右,即默认参数值的右面不能有无默认值的参数;调用时实参与形参的结合次序是从左向右。

例:

int add(int x, int y = 5, int z = 6);//正确

int add(int x = 1, int y = 5, int z);//错误

int add(int x = 1, int y, int z = 6);//错误

默认参数值与函数的调用位置

如果一个函数有原型声明,且原型声明在定义之前,则默认参数值应在函数原型声明中给出;如果只有函数的定义,或函数定义在前,则默认参数值可以函数定义中给出。

例:

 

函数重载的概念

C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。

例:

注意事项:重载函数的形参必须不同,个数不同或类型不同。

编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。

 

不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:

 

猜你喜欢

转载自www.cnblogs.com/puheng/p/9253718.html
今日推荐