C++学习随笔7 基于过程编程(3) - 程序结构

程序结构

  • 头文件

头文件可以包括的内容:

全局数据声明:   extern int n;   extern int a[];
函数声明:       void fn();
类型声明:      class A;
 
全局常量定义     const float pi = 3.14;
内敛函数定义     inline void fn(){...};
模板声明和定义   template<class T> class A{...};
命名空间定义     namespace N{...}
类型定义         enum COLOR{...};     class A{...};
预编译指令       #include <iostream> #define Pi 3.14

头文件不能包括的内容:

全局数据定义:   int a;   A AA; //A是class
函数定义:       void fn(){...}
  • 全局数据

全局数据区的整个区域在程序启动时,初始化为0。全局数据像函数一样可以多次声明,但只能定义一次。全局数据的声明形式是在全局数据定义形式前加关键字extern。

注意:如果全局数据声明写成初始化形式,那就变成了定义。

即对于:   extern int n = 9; //编译器将忽视extern而给n分配一个实际的空间

  • 静态数据

静态全局数据(作用域改变):static void f();    static in a = 2;     只在本文件范围内可见,在其他程序文件中不可见。

静态局部数据(生命周期改变):静态局部变量驻留在全局数据区,因而默认初始化的值为0。函数第一次被调用时,静态局部变量被建立,以后该变量一直存在,直到程序运行结束。

  • 作用域与生命周期

C++作用域有全局作用域、文件作用域、函数作用域(标号-goto,很少使用)、函数原型(声明)作用域、类作用域和局部作用域。

当全局变量j和局部变量j发生访问冲突时,默认访问的是局部变量j,若要访问全局变量j,需加前缀::,即::j。

  • 命名空间

命名空间:C++中解决名称冲突的命名空间机制。

命名空间定义:

namespace name{

    //名称声明或定义

}

一般总是将命名空间的定义放在头文件中。

命名空间用法:所有C++的标准库都属于命名空间std。可以把命名空间中所有名称一并默认,即:

using namespace std;

局部默认命名空间的名称使用:

using std::cout;

using std::endl;

如果没有前缀名,只有"::"加在名称前,则表示不属于任何命名空间的全局名称。

  • 预编译

 #include指令:如果头文件是C++系统提供的,则用尖括号把头文件括起来,如果是自己定义的头文件,则用双引号把头文件括起来。两者的差别主要在编译器的路径搜索顺序上。对于用了尖括号的头文件,编译器直接就到系统头文件路径上去搜索其头文件;对于用了双引号的头文件,编译器直接到源程序文件路径中去搜索,如果搜索不到则到系统头文件路径中再去搜索。

条件编译指令:#ifndef...#define...#endif  避免重复包含同一个头文件。

#define指令:用宏定义的函数类似于inline函数定义,它不是真正的函数调用,而是在#define所定义的名称处插入一段代码。

如:#define MAX(a, b) ((a)>(b) ? (a) : (b))

      MAX(a++, b);       //相当于((a++)>(b) ? (a++) : (b));

 

posted @ 2016-11-28 12:45  etcjd  阅读(160)  评论(0)    收藏  举报