第七章
一、知识点
1、因为头文件总是伴随着提供真正的资源,如函数定义等。因而,它不仅仅包括函数声明,它基本上还包括:(P241)
2、全局数据在程序存储结构中置身于全局数据区的位置, 全局数据区的整个区域在程序启动时,初始化为0。(P244)
3、在程序中,有的函数是为文件中的其他函数服务的,并不对外提供服务,这些函数声明为静态,表示局部于文件。同样有的变量只为本文件服务,也不是全局数据应标以static。这些函数和变量称为 静态全局函数和静态全局变量。(P251)
4、静态局部变量驻留在全局数据区,默认初始化的值为0,而且不会受函数的调用和返回的影响。函数第一次被调用时,静态局部变量被建立,以后该变量一直存在,直到程序运行结束。(P251)
5、函数作用域是说,不管名称在函数的什么地方声明,总是可以在函数的任何位置先使用该名称。只有标号是函数作用域的,设置标号即对标号名称进行声明。比如“goto 标号;”。函数作用域在C++中基本不用。(P253)
6、函数声明作用域或者称函数原型作用域规则,是表示 函数声明时的形参与上下文无关。(P253)
7、称静态局部数据的生命期为静态生命期,非静态局部数据的生命期为局部生命期。另一种动态生命期,这种生命期是由new申请到内存空间之后,该空间实体开始有效,直到人为地用delete语句释放该内存空间结束。在动态生命期中,其有效的堆空间实体可能被跨函数地访问,因此,其作用域是整个程序范围的。(P255)
8、名空间机制规定,一个名称必须在使用的域中明确声称其使用的“空间名”,才能在域中默认地使用该名称。(P256)
9、程序设计语言的描述可以对应整个世界。世界上有许多重名,它们再不同的场合表达着不同的意思,在不同的层次上亦表达着不同的意思。C++中解决名称冲突的名空间机制就是基于这种自然的理解。(P257)
10、名空间的定义通过下列形式:
namespace name{
//名称声明或定义
}
因为名空间总是凌驾于其他程序文件智商, 它是其他程序文件中的 所有外部名称使用的规范描述,所以总是将名空间的定义放在头文件中。(P257)
11、标准库中的某个名称用得很频繁,但是又可能会碰到标准库的名称与自己定义的名字相冲突,用不用using namespace都很为难,此时,可以局部默认名空间的名称使用。比如:
#include <iostream>
using std::cout;
using std::endl;
int abs(int a){return a > 0 ? a : -a}
int main(){
int a = abs(-5);
cout << a << endl;
}
如果没有前缀名,只有“::”加在名称前,则表示不属于任何名空间的全局名称。(P264)
12、条件编译的作用就是直接取舍程序语句和协调多个头文件。例如:(P265)
#ifdef _USE_OLD_RW_STL
#include <oldstl\fstream.h>
#else
#include <stlport\fstream>
#endif
13、条件编译指令的一种最常见的用法是头文件卫士。头文件卫士的目的是要保护嵌套的包含指令中的内部链接属性的名称不被重复定义。例如:(P266)
#ifndef DATE
#define DATE
struct Date{
int year, month, day;
};
#endif