C++ Primer Plus 随记(第九章)

1.在包含自己的头文件时,应用“ ”而不是< >,如“coordin.h”;  文件名在“ ”中,编译器将先在当前工作目录或源代码目录中查找。

  <iostream>, < >表示C++编译器将在存储标准头文件的主机系统的文件系统中查找。

2. 同一个文件中只能将同一个头文件包含1次

  #ifndef  COORDIN_H_

 #define COORDIN_H_

....

#endif

3、自动存储持续性:(自动变量)在函数定义中声明的变量(包含函数参数)的存储持续性为自动的,它们在程序开始执行其所属的函数或代码块时被创建,执行完函数或代码块时,它们使用的内存被释放。自动变量它们占的内存称为栈,内存释放后,值没有被删除,但不在被标记,栈顶恢复到原来的位置(代码块是指花括号{ }内包含的语句)

静态存储持续性:(静态变量)在函数定义外定义的变量和使用关键字static定义的变量的存储持续性为静态的,在程序的整个运行过程中都存在。编译器将分配固定的内存来存储静态变量。

动态存储持续性:(动态变量)用new运算符分配的内存一直都在,直到用delete运算符将其释放或程序结束,这种存储持续性为动态的,有时称为自由存储或

4、C++变量的作用域有多种,

  C++函数的作用域可以是整个类或整个名词空间(包括全局),但不能是局部(不能再代码块内定义函数)。

5. int main()

{

int  tel;  ...... //tel #1

{ int  tel;.....  } //tel #2,  在这可{ }代码块中tel #1被隐藏不可见,执行完该代码块后tel #1重新可见。

}

6. 关键字register:建议编译器用CPU寄存器来存储自动变量

7.静态持续变量的3种链接性 

int global=1000;  //global在代码块外声明,有外部链接性,程序的其他文件可使用global;

  static int one_file=50l; //one_file在代码块外声明,并用static限定符,有内部链接性,只能在包含上述代码的文件中使用one_file

int main() { ...}

void fun1 (int n){

static int count=0;   //count在代码块内声明,并用static限定符,无链接性

int lama=0; //静态变量count和自动变量类似,只能在fun1 ()函数中使用。不同的是即使fun1 ()函数没有执行count也占内存

}

void fun2 (int q){ ....}

8.未被初始化的静态变量的所有位都被设置为0;

静态变量的初始化分为:静态初始化 和动态初始化。静态初始化(零初始化和常量表达式初始化)

静态初始化:编译后初始化 const double pi=4.0*atan(1.0); 

9. 链接性为外部的变量称为外部变量。外部变量可以被程序中的多个文件使用,但每个使用外部变量的文件都要声明;但变量只能定义1次。因此有C++的两种声明:

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

引用声明:(声明)不分配存储空间,使用关键字extern,不初始化,如果初始化了变为定义,分配存储空间

extern int blem;  //声明,blem在其他地方定义

extern char gr='z'; // 定义gr,分配存储空间    double up; //定义up

10. 用const全局变量链接性为内部的。但可以用extern关键字来覆盖默认的内部链接性。

extern const int state=34; //有外部链接性

11.所有函数的存储持续性都是静态的,默认情况下,函数的链接性都是外部的。可以用extern(也可不用)指出函数在另一个文件中定义,还可以用static将函数链接性设置为内部,使之只能在一个文件中使用。

12. 使用new初始化: int * ar=new int[4] {2,6,7,3} ;

 用new和new[] 调用函数:

void * operator new(std::size_t) ; //size_t是一个typedef,对应于合适的整型。 释放函数:void operator delete(void *)

void * operator new[] (std::size_t) ; 释放函数:void operator delete [] (void *)

定位new运算符:

char buffer[500];

p1=new (buffer) int[20] ;// 将Int数组放置在buffer。

此时不需要delete [] p1; 因为buffer处于delte管辖之外。

13.创建名称空间的关键词 namespace, 任何名称空间中的名称不会与其他名称空间的名称冲突(不同名称空间可以用相同的名称)

namespace Jack{ double pail; void fetch(); int pal; } 

访问名称空间的名称用作用域解析运算符 ::  如Jack::pail=12.34;  包含名称空间的名称Jack::pail称为限定名称

14.using声明使特定的标识符可用: using Jack::fetch;  完成该声明后,在有效区域可用fetch代替Jack::fetch

using编译指令使整个名称空间可用using namespace Jack;名称空间所有名称都可用,不用作用域解析运算符 :: 

15.未命名的名称空间可替代链接性为内部的静态变量:

函数外声明:static int counts;

可写为函数外声明 : namespace     { int counts; }

16.一个文件中调用average(3,6)函数,返回两个int参数的int平均值,在同一个程序的另一个文件中调用,它返回返回两个int参数的double平均值,实现方法:

在每个文件中包含单独的静态函数定义,或每个文件在未命名的名称空间(上面的15)中定义一个合适的average()函数

   

猜你喜欢

转载自blog.csdn.net/lvliang2017232003/article/details/85990362