单独编译
将程序分为三个部分:
- 头文件:包含结构声明和使用这些结构的函数的原型。
- 源代码文件:包含与结构有关的函数的代码。
- 源代码文件:包含调用与结构相关的函数的代码。
一般尽量避免将函数定义或变量声明放到头文件中,防止出现重复定义的问题。
头文件经常包含的内容:
- 函数原型
- 使用 #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
名称空间
一般在大型项目中名称空间对于项目的使用更加友好,所以在参与大型项目的时候要再仔细看这部分的内容。