1、单独编译
将程序拆成三部分:
- 头文件:包含结构声明和使用这些结构声明的函数
- 源代码文件:包含与结构有关的函数的代码
- 源代码文件:包含调用与结构有关的函数的代码
头文件中一般包含以下内容:
- 函数原型
- 用#define或const定义的符号常量
- 结构声明
- 类声明
- 模板声明
- 内联函数
为防止在一个文件中包含同一个头文件多次, 在头文件中加上如下代码:
#ifndefine COORDIN_H
#define COORDIN_H
//place include file content here
#endif
2、存储持续性、作用域、和链接性
1、作用域:描述了名称在文件多大的范围内可见
2、链接性:描述了名称如何在不同的单元间共享
自动存储性
在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。
静态持续变量
1、外部链接性
在代码块的外面声明它,在其他文件中使用该变量是添加关键字extern,且不初始化。
2、内部链接性
在代码块外面声明它,并使用static限定符
3、没有链接性
在代码块内部声明,并使用static限定符
存储说明符
1、auto:用于自动推断类型
2、register:用于在声明中指示寄存器存储
3、static:被用在作用域为整个文件的声明中,表示内部链接性;被用于局部变量,表明局部变量的持续性是静态的
4、extern:引用的变量声明在别处
5、thread_local:指出变量的持续性与其所属线程的持续性相同
6、mutable:即使结构或类变量为const,其某个成员仍可以被修改
cv-限定符
1、volatile:如果程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个值两次,而是将这个值保存到缓存,将变量声明为volatile。
2、const,会把全局变量的链接性修改成内部的,如果希望某个某个常量的链接性是外部的,则可以使用extern关键字来覆盖默认的链接性,
extern const int a=5;
在这种情况下,所有使用该常量的文件中都必须使用extern关键字来声明它,但只能有一个对其进行初始化
语言链接性
链接程序需要每个函数都有不同的符号名,在C中一个函数只对应一个名称,但在c++中,一个名称可能对应多个函数,因此c++编译器执行函数名称矫正或修饰,为重载函数生成不同符号名称。
链接程序在寻找与c++匹配的函数名称时使用的方法与C不同。如果要在c++程序中使用C库中预编译的函数,可以通过函数原型来指出要约定的函数。
extern "C" void spiff(int) //use C protocol for name look-up
extern void spiff(int) //use C++ protocol for name look-up
extern "C++" void spiff(int) //use C++ protocol for name look-up
存储方案和动态分配
1、使用new运算符初始化
int *p=new int(6); //*p set to 6
2、new失败时
以前返回空指针,现在引发异常std::bad_alloc
3、new:运算符、函数和替换函数
运算符new,new[]分别调用以下函数
void operator new(std::size_t);
void operator new[](std::size_t);
同样的也有delete和delete[]函数
void operator delete(void *);
void operator delete[](void *);
4、定位new运算符
palcement new运算符,可以指定 要使用的位置
#include<iostream>
char buff[100];
int main()
{
using namespace std;
int *p = new (buff) int[5];
memset(p,0,5);
cout << p << " " << (void *)buff<<endl;
for (int i = 0; i < 5; i++, p++)
{
cout << *p << " ";
}
system("pause");
return 0;
}
其中指针p指向的地址与buff地址一致。且不能用delete释放p指向内存,因为不是由new申请的空间。