C++函数的定义及使用

Posted 学习郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++函数的定义及使用相关的知识,希望对你有一定的参考价值。

美剧《小鬼当家》剧照


共1925字,阅读约需5分钟;
概述
  • 函数可以被看作是一个由用户定义的操作。一般来说,函数由一个名字来表示。

  • 函数操作数,称为参数(parameter),由一位于括号中、并且逗号分隔的参数表(parameter list)指定。

  • 函数的结果被称为返回值(return value),返回值的类型被称为函数返回类型(return type)。不产生值的函数,返回类型void,意思是什么都不返回。

  • 函数执行的动作在函数体(body)中指定。函数体包含在花括号中,有时也称为函数块(function block)。

  • 函数返回类型、以及其后的函数名、参数表和函数体构成了函数定义


函数声明由函数返回类型、函数名和参数表构成。这三个元素被称为函数声明(function declaration)或函数原型(function prototype)。一个函数可在一个文件中被声明多次。

01

函数原型

函数原型由函数返回类型、函数名以及参数表构成。函数原型描述的是函数的接口,它详细描述了调用函数时需要提供的参数的类型和个数,以及函数返回值的类型。


 02


函数返回类型

函数返回类型可以是预定义类型(如int或double)、复合类型(如int&或double*)、用户定义类型(如枚举、类或void,后者意指函数不返回值)。

#include <string>#include <vector>
class Date{ /* 定义 */ };
bool look_up(int *, int);double calc(double);int count(const string &, char);Date& calendar(const char*);void sum(vector<int>&, int);
  • 函数类型和内置数组类型不能用作返回类型,我们必须返回一个指向数组中元素类型的指针。

int[10] foo_bar(); //非法: 数组不能作返回类型
int *foo_bar(); //ok: 指向数组的第一个元素的指针

  • 类类型和容器类型可以被直接返回。

list<char> foo_bar(); //ok: 返回类型是char的list
  • 函数必须指定一个返回值,没有显式返回值的声明或者定义将引起编译错误。


const is_equal(vector<int> v1, vector<int> v2); //错误: 没有返回类型
const bool is_equal(vector<int> v1, verctor<int> v2); //ok: 返回类型已被指定


03


函数参数表

函数的参数表不能省略。没有任何参数的函数可以用空参数表或含有单个关键字void的参数表来表示。

int fork(); //隐式的void参数表
int fork(void); //等价声明
  • 参数表由逗号分隔的参数类型列表构成。每个参数类型之后可以跟一个名字,它是可选的。参数表中使用逗号分隔的简写方式(即在声明中使用的方式)是错误的。

int manip(int v1, v2); //错误
int manip(int v1, int v2); //ok
  • 参数表中不能出现同名的参数。函数定义的参数表中的参数名允许在函数体中访问这个参数。函数声明中的参数名不是必需的,如果名字存在的话,它应用被用作辅助文档。

void print(int *array, int size);

PS:在C++中,两个函数可能同名但参数表不同,这种函数被称为重载函数(overloaded function)。参数表称为函数的符号特征(signature),因为它被用来区分函数的不同实例。


04

  参数传递   

① 函数调用时传送给形参的实参必须与形参三个一致
类型、个数、顺序
② 参数传递有两种方式
传值方式【参数为整型、实型、字符型等】
传地址
  •  参数为指针变量

  •  参数为引用类型

  • 参数为数组名


05

传值方式:

把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。


#include <iostream.h>Void swap(float m, float n){ float temp; temp =m; m=n; n=temp;}
Void main(){ float a,b; cin>>a>>b; swap(a,b); cout<<a<<endl<<b<<endl;}


06


  • 形参变化影响实参

#include<iostream.h>Void swap(float *m , float *n){ float t; t = *m; *m =*n; *n = t;}
Void main(){ float a, b, *p1,*p2; cin>>a>>b; P1=&a; p2=&b;  swap(p1,p2);  cout<<a<<endl<<b<<endl;}


07


  • 对形参数组所做的任何改变都将反应到实参数组中


#include<iostream.h>Void sub(char b[]){ b [] =”world”;}
Void main(){ char a[10]=”hello”; sub(a); cout<<a<<endl;}


08


先来个自问自答:

王火锅:李大军,你来说说什么是引用?

李大军:(⊙o⊙)…它用来给一个对象提供一个替代的名字。

王火锅:答得很好嘛!【C++】函数的定义及使用

#include<iostream.h>Void main(){ int i=5; int &j = i; i = 7; cout<<”i=”<<i<<”j=”<<j;}


j是一个引用类型,代表i的一个替代名

i值改变时,j的值也跟着改变,所以会输出i=7,j=7

 

09


引用类型做形参的三点说明:

① 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。

② 引用类型做形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量做参数,形参与实参就占用不同的存储单元,所以形参变量的值是是参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。


END

以上是关于C++函数的定义及使用的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

C++函数的定义及使用

这些 C++ 代码片段有啥作用?

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

第六章第八节Lua及C++函数