2021-11-23

C++学习笔记(15)

1.内联函数
函数调用时需要建立堆栈空间来保存调用时的现场状态和返回地址并进行参数传递,产生程序转移,需要时间和空间的开销。
内联函数机制则定义一些功能比较简单,代码比较短的函数,编译时系统把内联函数的函数体嵌入每个函数调用处,节省了程序运行时的调用开销。
一般在函数原型中指定 inline,不能在函数定义时二次指定。
inline 类型 函数名(形参表);
调用方法和普通函数一样。
注意:①若inline不在函数名第一次出现时指定,则系统视为普通函数;
②一般内联函数只适用于1~5行小程序,不能含有复杂的流程控制语句。(如多分支语句和循环语句)
③递归函数不能说明为内联函数。

2.重载函数
C++允许定义多个同名函数,各个函数有不同的参数集。
函数重载常用于生成几个类似任务而处理不同数据个数、类型的同名函数。
C++编译器只根据函数参数表(参数类型和个数)进行重载版本的调用匹配,函数返回值的内容不起作用。
注意:重载函数中使用默认参数时可能产生二义性。
例:
int max(int,int);
int max(int,int,int=0);
则调用max(5,3)时无法选择调用版本。

3.一个被说明的变量:
标识符存储性:标识符在内存中的生存时间和和连接特性;
标识符作用域:在程序正文中能引用这个标识符的那部分区域;
可见性:一个标识符在作用域的某部分程序正文区域中能直接引用,则成为可见。
连接性:标识符能否被其他文件引用;(一个应用程序成为一个项目,一个项目可以有多个文件组成)

4.自动存储:(auto和register)
只有变量有自动存储特性,在进入说明的语句块时生成,在结束语句块时删除,是变量的默认状态。
函数的参数和局部变量都是自动存储的。
C++默认自动存储变量,auto很少用;
编译器能识别经常使用的变量,不需要程序员进行register声明。

静态存储(estern和static)
若用于说明变量,程序在开始执行时就会分配和初始化存储空间;
若用于说明函数,表示程序从执行开始就存在这个函数名。

全局说明的标识符默认为extern;
static说明的局部变量只能在定义该变量的函数体中使用——在第一次使用时进行初始化(默认初始值为0),函数退出时系统保留其存储空间和数值,下次使用时static变量还是上次的值。

5.标识符的作用域和可见性
一般情况下,一个标识符在作用域内可见,但在嵌套或层次结构中,若定义了同名标识符,可见性和作用域就不一定等价。

C++的标识符有5种作用域:函数原型、块、函数、类和文件作用域。

函数作用域:语句标号(后面带冒号的标识符)是唯一具有函数作用域的标识符。(例:switch中的case,goto语句转向入口等,标号可以在函数体中任何地方使用,但不能在函数体外引用)
实际上,函数体是一个特殊的块。

文件作用域:任何在函数体之外说明的标识符都具有文件作用域,从说明处起到文件尾的任何函数都是可见的。

全局变量:具有文件作用域,默认初值为0。
局部变量:具有块作用域,默认初值为随机值。(注:形参视为局部变量)
当局部变量和全局变量同名时,在块内全局变量被屏蔽,要在块内访问全局变量可以使用作用域运算符“::”。
(注意:局部变量只是屏蔽而不是覆盖了全局变量,全局变量不可见但是有作用,所以可以通过作用域运算符来访问;
但是外层块和内层块有同名变量时,在内层块不能通过作用域运算符来访问外层块的同名变量。)

程序中一般不使用全局变量,以免被意外修改出错;且当函数的传递只使用参数时更利于调试和重用。

6.多文件结构
一个能够表达特定功能的模块由两部分构成:
①规范说明:集中在以扩展名为.h的头文件,描述一个模块和其他模块的接口,一般包括函数原型、类说明、类型说明、全局变量说明、包含指令、宏定义、注释等;
②实现部分:放在以扩展名为.cpp文件中,通常称为实现文件。

7.C++中无论是.h还是.cpp文件都是可以阅读的文本文件,称为可执行文件要经过三步:预处理,编译,连接。
预处理:阅读源程序,执行预处理指令,嵌入指定源文件;
编译:对预处理器生成的临时文件进行语法分析、语义分析,生成目标代码;
连接:连接器连接标准库,生成可执行文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值