目录
- 将原来的程序分为三部分:头文件、主函数和子函数
- 静态持续性、外部链接性
- 静态持续性、内部链接性
- 静态存储持续性、无链接性(涉及到一个静态变量在字符串输入的应用)
- 存储方案和动态分配
- 定位new运算符
- 名称空间特性
- 名称空间示例
- 名称空间的使用规范
将原来的程序分为三部分:头文件、主函数和子函数
/*
01)原来的源程序可以分为三部分:
A 头文件:包含结构声明和使用这写结构的函数的原型
B 源代码文件:包含与结构有关的函数的代码(主函数)
C 源代码文件:包含调用与结构相关的代码(子函数)
02)头文件中常包含的内容:
函数原型(函数声明)、使用#define或const定义的符号常量
结构声明、类声明、模板声明、内联函数
03)在包含头文件时,我们使用"coordin.h",而不是<coordin.h>。
如果头文件包含在尖括号内,则c++编译器将在存储标准头文件的主机系统的文件系统中查找;
如果头文件包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录;如果没有在
那里找到头文件,则将在标准位置查找,因此在包含自己的头文件时候,应该使用双引号而不是尖括号
*/
存储类型、作用域和链接性
01)自动存储:在函数内部定义的常规变量使用自动存储空间,被称为自动变量,这意味着它们在所属的函数被调用时
自动生成,在该函数结束时消亡。自动变量通常存储在栈中,这意味着其中变量依次加入到栈中,而在离开栈时,
将按相反的顺序释放这些变量,这被称为"后进先出(LIFO)",因此在程序执行的过程中,栈将不断的减小或增大。
02)静态存储:是一种在整个程序执行期间都存在的存储方式,使变量称为静态的方式有两种:一种是在函数外满定义
变量,另一种是在声明变量时使用关键字stctic。
03)动态存储:new是delete提供的存储方式。它们管理一个内存池,这在c++这被称为自由存储空间(free store)或
堆(heap),该内存池同用于自动变量和自动变量的内存是分开的。
04)作用域: 描述了名称在文件(翻译单元)的多大范围内课件。例如在函数定义的变量可在该函数中使用,但在
其他函数则不可以;而在函数外面定义的变量则可以在所有函数中使用。
05)链接性: 描述了名称如何在不同单元间共享。链接性为内部的名称只能由一个文件中的函数共享。
自动变量没有连接性,因为它们不能共享。
自动存储持续性
01)在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。也就是说
如果mian()函数中声明了一个texas的变量,在子函数oil()中也声明了一个texas变量,则创建两个独立的变量,
只有在定义它们的函数中才可以使用它们。对oil()函数中的texas变量执行的任何操作不会影响main()函数中的
texas变量,反之亦然。例如如下代码块
int main()
{
int teledeli = 5;
//定义代码块
{
int teledeli = 23;
teledeli = teledeli+1;
cout<<"Hello"<<teledeli<<endl; //打印的是24
}
teledeli = teledeli+1;
cout<<"Hello"<<teledeli<<endl; //打印的是6
}
02)寄存器变量: 关键字register最初是由c语言提出的,它建议编译器使用CPU寄存器来存储自动变量,这旨在
提高访问变量的速度。
register int cout_fast; //声明一个寄存器变量
静态持续变量&static的两种用法
01)c++为静态存储持续性变量提供了三种链接性:外部链接性(可在其他文件中访问,用static声明)、
内部链接性(只能在当前文件中访问,用static声明)和无连接型(只能在当前函数代码块或子函数
中访问,用static声明)。这三种链接性的变量在整个程序执行期间都存在,
//global具有外部链接性,在程序的其他文件只也可以使用
//如何在其他cpp文件中使用另外一个cpp文件中的外部变量(即上面的变量global)?使用关键字extern,接下来将会介绍
//下面一句中的static表示的是内部链接性,变量是静态持续性
static int one_file = 50; //one_file具有内部链接性,只能在包含上述代码的文件中使用它
int main()
{
....
}
void fun1(int n)
{
//此时static表示的是存储持续性
static int count = 0; //count没有链接性,作用域为局部,这意味着只能在fun1只使用它
int llama = 0; //与llama不同的是,即使fun1()函数没有被执行,count也留在内存中
}
02)static的两种用法:
A 用于局部声明(函数内声明变量),以指出变量时无连接型的静态变量时,static标示的是存储持续性;
B 用于代码块外的声明时,static表示的是内部链接性,而变量已经是静态持续性了
总结如下表:
静态持续性、外部链接性
01)变量的定义方法(两种):
A 定义声明(简称定义):它给变量分配存储空间
B 引用声明(简称声明):它不给变量分配存储UKon关键,因为它引用已有的变量,
引用变量使用关键字extern,且不能给变量初始化,否则声明变为定义,导致分配存储空间
double up; //定义
extern int blem; //声明,不能初始化
extern char gr = 'A'; //定义,虽然使用了extern,但是给变量初始化了
02)一方面,在每个使用外部变量(在函数外定义的变量)都必须声明它,
另一方面:变量只能定义一次(单定义规则)
03)如果在多个cpp文件中使用main.cpp或其他cpp文件中的外部定义,只需在一个cpp文件中包含该变量
的定义(单定义规则),但在其他使用改变量的其他cpp文件中,都必须使用关键字extern声明它,如:
//file01.cpp
extern int cats = 20; //extern可以省略,加上也是可以的
int dogs = 22;
int fleas;
//file02.cpp
extern int cats; //使用extern之后,在file02.cpp之后就可以使用file01.cpp中的cats变量
extern int dogs; //使用extern之后,在file02.cpp之后就可以使用file01.cpp中的dogs变量
//file03.cpp
extern int cats; //使用extern之后,在file03.cpp之后就可以使用file01.cpp中的cats变量
extern int dogs; //使用extern之后,在file03.cpp之后就可以使用file01.cpp中的dogs变量
extern int fleas; //使用extern之后,在file03.cpp之后就可以使用file01.cpp中的fleas变量
1 //external.cpp 2 //compile with support.cpp 3 4 #include <iostream> 5 6 using namespace std; 7 8 double warming = 0.3; //定义外部变量(全局变量),在support.cpp中也可以使用的 9 10 void update(double dt); //声明一个函数,该函数在support.cpp中定义 11 void local(); //声明一个函数,该函数在support.cpp中定义 12 13 int main() 14 { 15 cout << "Global waiming is " << warming << endl; 16 update(0.1); //调用support.cpp中定义的函数 17 cout << "Global waiming is " << warming << endl; 18 local(); //调用support.cpp中定义的函数 19 cout << "Global waiming is " << warming << endl; 20 21 system("pause"); 22 return 0; 23 }