c++Primer学习笔记(7)--函数

第七章 函数

l         函数定义和声明:我们必须在调用函数之前就声明该函数,否则会引起编译错误;当然函数定义也可以被用作声明,但是函数在程序中只能被定义一次。典型情况下函数定义被放在单独的程序文本文件中或者与其他相关的函数定义放在同一个文本文件中,要想在其他文件而不是包含函数定义的文件中使用该函数,我们必须要用到另外一种函数声明机制,将包含该函数的文件#include进来。

l         函数声明由函数返回类型、函数名和参数表构成,这三个元素被称为函数声明function declaration 或函数原型function prototype。函数声明以及inline 函数的定义最好放在头文件中。

l         函数原型由函数返回类型函数名以及参数表构成。函数原型描述的是函数的接口,它详细描述了调用函数时需要提供的参数的类型和个数以及函数返回值的类型。在C++标准化之前,如果缺少显式返回类型的话返回值会被假定为int类型。在标准C++中,返回类型不能被省略。

l         函数的参数表不能省略,没有任何参数的函数可以用空参数表或含有单个关键字void 的参数表来表示。在C++中两个函数可能同名,但参数表不同这种函数被称为重载函数overloaded function 参数表称为函数的符号特征signature 冈为它被用来区分函数的不同实例。有了名字和符号特征就可以惟一地标识函数;也就是一个函数由函数名和参数唯一确定。

l         参数传递的几种方式:(1C++中参数传递的缺省初始化方法是把实参的值拷贝到参数的存储区中,这被称为按值传递pass-by-value。按值传递时函数不会访问当前调用的实参,函数处理的值是它本地的拷贝。(2引用传递,把参数声明成引用实际上改变了缺省的按值传递参数的传递机制。在按值传递时函数操纵的是实参的本地拷贝;当参数是引用时函数接收的是实参的左值而不是值的拷贝,这意味着函数知道实参在内存中的位置因而能够改变它的值或取它的地址。(3指针传递,与引用传递差不多,也是传递内存中的地址。它与引用的区别:引用必须被初始化为指向一个对象,一旦初始化了它就不能再指向其他对象;指针可以指向一系列不同的对象,也可以什么都不指向。如果一个参数可能在函数中指向不同的对象或者这个参数可能不指向任何对象,则必须使用指针参数。(4数组参数,C++中,数组永远不会按值传递,它是传递第一个元素准确地说是第0 个的指针。(5抽象容器类型参数,容器类型实际上是类类型,它比内置数组数据类型提供了更多的功能。(6缺省实参,函数可以用参数表中的初始化语法为一个或多个参数指定缺省实参。调用包含缺省实参的函数时,我们可以也可以不为该参数提供实参,如果提供了实参则它将覆盖缺省的实参值,否则函数将使用缺省实参值。(7省略号,有时候我们无法列出传递给函数的所有实参的类型和数目。在这种情况下我们可以用省略号... 指定函数参数表。省略号挂起类型检查机制它们的出现,告知编译器当函数被调用时可以有0 个或多个实参,而实参的类型未知。省略号有下列两种形式void foo( parm_list, ... );  void foo( ... );  第一种形式为特定数目的函数参数提供了声明,在这种情况下当函数被调用时对于与显式声明的参数相对应的实参进行类型检查,而对于与省略号对应的实参则挂起类型检查。在第一种形式中参数声明后面的逗号是可选的。

l         函数返回值return 语句被放在函数体内,这条语句结束当前正在执行的函数。在程序执行期间遇到return 语句时,程序控制权被返回给调用此函数的函数。return 语句有两种形式:return;  return expression;

l         递归函数,直接或者间接调用自己的函数称为递归函数。递归函数必须定义一个停止条件,否则会无限递归下去。

l         内联函数(inline,出现原因:调用函数比直接计算条件操作符要慢得多。若一个函数被指定为inline 函数,则它将在程序中每个调用点上被内联地展开。

l         链接指示符“extern C程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的。链接指示符有两种形式,既可以是单一语句single statement 形式。也可以是复合语句compound statement 形式。

// 单一语句形式的链接指示符

extern "C" void exit(int);

// 复合语句形式的链接指示符

extern "C" {

int printf( const char* ... );

int scanf( const char* ... );

}

// 复合语句形式的链接指示符

extern "C" {

#include <cmath>

}链接指示符的第一种形式由关键字extern 后跟一个字符串常量以及一个普通的函数声明构成,虽然函数是用另外一种语言编写的,但调用它仍然需要类型检查。

l         Main()处理命令行选项Main()函数原形,int main( int argc, char *argv[] ) { ... }argc 包含命令行选项的个数,argv 包含aygc C 风格字符串,代表了由空格分隔的命令选项。argv[0]总是被设置为当前正被调用的命令。从索引1 argc-1 表示被传递给命令的实际选项。

l         指向函数的指针,int (*pf)( const string &, const string & ); 这个语句声明了pf 是一个指向函数的指针,该函数有两个参数和int 型的返回值即指向函数的指针。当一个函数名没有被调用操作符修饰时,会被解释成指向该类型函数的指针。指向函数的指针可以被用来调用它所指向的函数。调用函数时,不需要解引用操作符。无论是用函数名直接调用函数还是用指针间接调用函数,两者的写法是一样的。我们还可以定义函数指针数组。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值