C++基础学习之内存模型与名称空间(5)

单独编译

将程序分为三个部分:

  • 头文件:包含结构声明和使用这些结构的函数的原型。
  • 源代码文件:包含与结构有关的函数的代码。
  • 源代码文件:包含调用与结构相关的函数的代码。

一般尽量避免将函数定义或变量声明放到头文件中,防止出现重复定义的问题。
头文件经常包含的内容:

  • 函数原型
  • 使用 #define或const定义的符号常量
  • 结构声明
  • 类声明
  • 模板声明
  • 内联函数

头文件格式:

#ifndef COORDIN_H_
#define COORDIN_H_
// place include file contents here
#endif

存储持续性,作用域和链接性

C++中四种存储数据的方案:

  • 自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。C++有两种存储持续性为自动的变量。
  • 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。它们在程序整个运行的过程中都存在。C++有三种存储持续性为静态的变量。
  • 线程存储持续性(C++11):当前,多核处理器很常见,这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程一样长。
  • 动态存储持续性:用new运算符分配的内存将一直存在,知道使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时被称为自由存储或堆。

自动存储持续性变量

在一个函数中定义了变量则这个变量只在这个函数中使用,如果在一个函数中定义了变量teledei和websight,而在函数中的一个代码块中又定义了teledei,那么在执行到这个代码块时,之前的teledei将被隐藏,在这个代码块中将使用新定义的teledei,也就是说不会对原来的teledei造成影响,代码块结束后新定义的teledei被释放,原来的teledei重新可用。而且在代码块中是可以直接使用websight的。
自动变量使用栈来存储,所以执行完之后恢复栈顶位置即可释放变量所占内存。

静态持续变量

C++为静态存储持续性变量提供了3种链接性:外部链接性(可在其它文件中访问)、内部链接性(只能在当前文件中访问)和无链接性(只能在当前函数或代码块中访问)。这3种链接性都在整个程序执行期间存在,与自动变量相比,它们的寿命更长。
要想创建链接性为外部的静态持续变量,必须在代码块的外面声明它;要创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符。

...
int global = 1000;
static int one_file = 50;
int main()
{
...
}
void funct1(int n)
{
	static int count = 0;
	int llama = 0;
	...
}

上面程序中定义的global、one_file、count在整个程序执行其间都存在。在funct1()中声明的变量count的作用域为局部,没有链接性,这意味着只能在funct1()函数中使用它。但是count在funct1没有执行时,count也留在内存中。而global和one_file的作用域为整个文件。也就是说定义在函数外部的不加static关键字也是静态变量,而在函数内想定义静态变量必须使用关键字static。
外部变量可以作为全局变量,可能会在其它文件中用到,所以其它文件用到的时候必须对这个变量进行引用声明,声明方式如下:

// file01.cpp
extern int cats = 20;	// definition because of initialization
int dogs = 22;	//definition
int fleas;	//definition
...
// file02.cpp
// use cats and dogs from file01.cpp
extern int cats;	//not definition because they use
extern int dogs;	//extern and have no initialization
...
// file98.cpp
// use cats, dogs, and fleas from file01.cpp
extern int cats;
extern int dogs;
extern int fleas;
...

另外文件中已经extern声明了变量后,这个文件中的函数如果重新定义同名变量则会隐藏这个全局变量,此时如果再想使用全局变量可以加::para_name来使用它。
如果在两个文件中都定义同一个外部变量会产生错误:

// file1
int errors = 20;
// file2
int errors = 5;

这种情况可以在file2中的定义之前加上static关键字表明这个变量的链接性为内部,这样就会隐藏外部变量而使用新定义的变量。
另外对于const关键字,它的链接属性和static一样,因此想要在其它文件中使用这样的变量,需要在const前再加一个extrern关键字来覆盖掉const的内部链接属性。
此外,extern和static也可以用在函数定义之前。

使用new运算符进行初始化

下面的几段代码演示了对标量、数组、等进行初始化:

int * pi = new int (6);	// *pi set to 6
double * pd = new double (99.99)	// *pd set to 99.99

struct where {double x; double y; double z;};
where * one = new where {2.5, 5.3, 7.2};
int * ar = new int [4] {2, 4, 6, 7};

int * pi = new int {6};	// *pi set to 6
double * pd = new double {99.99};	// *pd set to 99.99

名称空间

一般在大型项目中名称空间对于项目的使用更加友好,所以在参与大型项目的时候要再仔细看这部分的内容。

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/83341063
今日推荐