龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

《C++ primer plus》读书笔记(三)

时间:2014-10-17 02:10来源:网络整理 作者:网络 点击:
分享到:
本文是C++读书笔记系列的第三篇,是读完《C++ primer plus》一书第九、十两章记录下来的笔记,学习C++的同学可以看看参考下。

 第九章

1、C++程序的组成——

  (1)、头文件:  包含结构声明和使用这些结构的原型。

  (2)、源代码文件:  包含与结构有关的函数的代码。

  (3)、源代码文件:  包含调用与结构有关的函数的代码。

2、头文件——

  (1)、常包含的内容:  函数原型;#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。  

  (2)、若文件名包含在尖括号中,编译器将在存储标准头文件的主机系统的文件系统中查找。

  (3)、若文件名包含在双引号中,编译器首先查找当前的工作目录或源代码目录,再在标准位置查找。

  (4)、同一个文件中只能将同一个头文件包含一次。用来忽略除第一次包含之外的所有内容。

  头文件coordin.h中,常使用:  #ifndef COORDIN_H_  define  COORDIN_H_  /*头文件内容*/  #endif

3、编译过程——

  (1)、命令:  CC file1.cpp file2.cpp

  (2)、预处理器将包含的文件(头文件之类的)和源代码合并。生成临时文件temp1.cpp和temp2.cpp

  (3)、编译器创建每个源代码文件的目标代码文件:file1.o和file2.o

  (4)、链接程序将目标代码文件、库代码和启动代码合并,生成可执行文件:a.out

  (注意!链接编译模块的时候,请确保所有对象文件和库都是同一个编译器生成的。)

4、存储持续性——自动存储持续性、静态存储持续性、线程存储持续性(C++11)、动态存储持续性。

5、栈——栈中的数据在相邻的内存单元中

  (1)、使用2个指针跟踪栈,一个指向栈底(栈的开始位置),一个指向栈顶(下一个可用内存单元)

  (2)、新值没有被删除,但不再被标记。

6、链接性——

  (1)、外部链接性,可在其他文件中访问。如:  函数外,不使用staitic定义的变量

  (2)、内部链接性,只能在当前文件中访问。如:  函数外,使用static定义的变量

  (3)、无链接性,只能在当前函数或代码块中访问。如:  代码块中定义的变量  

  (注意!所有的静态变量都会首先被零初始化,然后再选择动态、静态初始化。)

7、变量声明——

  单定义规则 -> 变量只能有一次定义

  (1)、定义声明(定义):给变量分配存储空间。

  (2)、引用声明(声明):不分配空间,引用已有的变量。使用关键字extern,且不进行初始化。

  (注意!要在多个文件中使用外部变量,应在一个文件中定义,其他文件中使用extern声明。)

  (使用extern可以覆盖变量默认的内部链接性,使其变成外部的)

8、const char * const a[12] = { “a”,"b","c"... };  // 第一个const防止字符串被修改,第二个const确保数组中每个指针指向它最初指向的字符串。

   这个指针的类型是 char * [12],即char类型的指针的数组,数组大小为12。第一个const修饰char *,第二个const修饰a[12]。所以。

9、说明符和限定符——

  (1)、关键字thread_local:  指出变量的持续性和其所属的持续性相同。

  (2)、const:  内存被初始化后,程序不能对它修改。const全局变量的链接性为内部的。

  (3)、volatile:  每次都取值,不允许取值优化。

  (4)、mutable:  即使结构(或类)变量为const,某个被mutable修饰的成员也可以被修改。

10、函数的链接性——所有函数的存储持续性都自动为静态的,链接性是外部的。可以使用static在原型和定义中将链接性设置为内部的。

11、使用new初始化——

   int a = new int(5);  //设置a的值为5. 比较之下,大括号初始化更方便和通用。

  (new找不到请求的内存量、失败时,将引发异常std::bad_alloc)

  (1)、运算符new实际上调用void * operator new ( std::size_t );

  (2)、运算符new[] 实际上调用void * operator new[] ( std::size_t );  //这里std::size_t实际上是一个别名typedef,对应合适的整型。

12、定位new运算符——

  能指定要使用的内存位置。不跟踪哪些内存单元未使用,也不查找未使用的内存块。

  (1)如:#include <new>  char buffer[50];  struct1 * s = new (buffer) struct1;  //从buffer中分配struct1大小的内存。

13、名称空间——

  相当于Java中的package,不过也有很多不同。

  (1)、名称空间可以是全局的,也可以位于另一个名称空间中。

  (2)、默认情况下,名称空间中声明的名称的链接性是外部的。

  (3)、全局名称空间,对应文件级声明区域,全局变量位于此处。

精彩图集

赞助商链接