浅谈c++语言中的函数

  首先介绍函数,可以说每个程序都是靠各种函数组成。通过使用函数(functions)我们可以把我们的程序以更模块化的形式组织起来,从而利用C++所能提供的所有结构化编程的潜力。

 

1.一个函数(function)是一个可以从程序其它地方调用执行的语句块。以下是它的格式:

 

type name ( argument1, argument2, ...)

statement

type 是函数返回的数据的类型

name 是函数被调用时使用的名

argument 是函数调用需要传入的参量(可以声明任意多个参量)。每个参量(argument)由一个数据类型后面跟一个标识名称组成,就像变量声明中一样(例如,int x)。参量仅在函数范围内有效,可以和函数中的其它变量一样使用,它们使得函数在被调用时可以传入参数,不同的参数用逗号(comma)隔开.

statement 是函数的内容。它可以是一句指令,也可以是一组指令组成的语句块。如果是一组指令,则语句块必须用花括号{}括起来,这也是我们最常见到情况。其实为了使程序的格式更加统一清晰,建议在仅有一条指令的时候也使用花括号,这是一个良好的编程习惯。

介绍完格式,我们来应用一下,写一个好理解的函数

int sum(int n)
{int t=0;
for(int i=1;i<=n;i++)
{t+=i;}
return 0;}

 2.函数的种类: 此函数是一个有参函数,即有参数传递的函数,一般需要用return 返回函数值。当然除了有参函数还有无参函数,与有参函数相反,函数没有参数传递,也不需要返回函数值,函数定义时要用void。除了有参和无参函数,还有空函数,空函数只有一对花括号,里面没有任何语句,空函数不需要完成什么工作,只占据一个位置,在大型程序设计中,有扩充函数的功能。

3.函数的定义和函数原型声明

(1)函数定义

    (1)函数头:函数名尽量以动词开头,表明函数动作

    (2)函数体

 

(2)函数声明函数头;

    (1)在函数原型中尽量包含参数名,参数名能够起到很好的说明作用,在编程

    风格良好的代码中,函数原型中的的参数名称具有极强的说明作用。

 

    (2)函数定义本身也是一种声明,与变量的声明类似,也是有关强弱符号的问题,

    主要就是为了在程序进行链接的时候,便于函数链接域的扩展。

 

    (3)函数声明尽量放在头文件中,头文件的作用就是用于暂存各种声明

       (1)预处理类的声明

       (2)各种自定义类型的声明:结构体,联合体,类

       (3)各种函数声明

       (4)内联函数的定义

       (5)全局变量的声明

(3)在C++中,可以有同名的函数,只要参数列表不同即可,在c++中,域名+函数名+参数列表来表示一个唯一的函数签名。

4.参数传递和调用

(1)c++中函数调用

    传参和返回值允许进行隐式的强制转换,但是很有可能会出现数据丢失的

    情况,所以要求尽可能将实参与形参的类型进行统一,必要时可以使用()

    和reinterpret_cast<>()等强制转换符号将实参进行显示的转换。

 

(2)函数参数传递的几种情况

    (1)普通值传递

      

    (2)特殊值传递(指针或地址传递)

      

(3)使用引用进行传参(c++特有的方式)

       (1)效率最高的传参方式,实参和形参是同一个,不会复制,没有副本空间

       (2)引用的负面问题

           传递引用时实参的写法与传递一个普通值得写法相同,导致调用该函数时

           很难区分实参的值会不会修改,非常不利于程序代码的清晰阅读。

 

       (3)如果函数形参是非常量引用的话,不允许实参是常量(或者是const,或者是这类的数值常量(宏常量))

       (4)使用引用进行传参是为了提高了效率,如何防止实参被修改的情况呢?使用const,如果形参是const引用,实参为常量或者变量都可以。

       (5)引用只能被初始化,不能被赋值,而且编译器要求引用必须被初始化。传递引用,其实就是初始化引用,

           每次函数被调用时,引用类型的形参都会被重新初始化。

(3)指针和引用

   (1)引用的效率会高于指针

 

    (2)不管是使用引用还是使用指针,只要不涉及修改实参的操作,就一定要使用const进行限制。

 

    (3)指针类型的形参是一个新的变量空间,使用时需要使用*解引用(寻找指向的空间)。

       引用只是一个别名,形参和实参是同一个变量空间,使用时不需要解引用。

 

    (4)指针可以为NULL,但是引用一般情况不许为NULL(除了NULL的引用),因此使用指针前,最好是对指针先进行是否为空的判断,这在前面讲指针的时候特意提到过。别是在返回指针做回左值时,一定要保证指针的有效性。

5.函数的返回值

当一个函数不要返回任何值时,该函数为空函数,其类型为void,当该函数也没有参数时,也可以用void表示无参数,也可什么都不填,例如:

void printmessage (void)
{
  cout << "I'm a function!";
}

定义了一个空函数,该函数无返回值,且没有参数。

 

 

 

对于main()函数来说,一般情况下函数的返回值为int,且返回值默认为0,main()函数的返回值 return 0; 并无实际意义,返回值为0仅表示函数运行正常。

6.变量及作用域

作用域是程序的一个区域,一般来说有三个地方可以声明变量:

在函数或一个代码块内部声明的变量,称为局部变量。

在函数参数的定义中声明的变量,称为形式参数。

在所有函数外部声明的变量,称为全局变量。

(1)局部变量

在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。下面的实例使用了局部变量:

#include <iostream>
using namespace std;
 int main (){  // 局部变量声明  int a, b;  int c;  // 实际初始化  a = 10; b = 20;  c = a + b;  
 cout << c;   return 0;}

(2)全局变量

在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。

全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量:

#include <iostream>
using namespace std; // 全局变量声明int g; int main (){  // 局部变量声明  int a, b;   // 实际初始化
  a = 10;  b = 20;  g = a + b;  cout << g;   return 0;}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:

#include <iostream
>using namespace std; // 全局变量声明int g = 20; int main (){  // 局部变量声明  int g = 10;  
 cout << g;   return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

10

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

数据类型         初始化默认值

int	0
char	'\0'
float	0
double	0
pointer	NULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。




 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值