组织程序的策略
在同一个文件中只能将同一个头文件包含一次。如何避免多次包含同一个文件?
#ifndef COORDIN_H_//COORDIN是文件名,规范命名格式
#define COORDIN_H_
#endif
C++11采用4种不同的方案来存储数据,区别是数据保留在内存中的时间
自动变量和栈
栈式LIFO(后进先出)的,即最后加入到栈中的变量首先被弹出
程序使用两个指针来跟踪栈,一个指针指向栈底——栈的开始位置,另一个指针指向栈顶——下一个可用内存单元
寄存器变量register int count_fast;
register是由C语言引入的,它建议编译器使用CPU寄存器来存储自动变量,旨在提高访问变量的速度,但在C++11,这种提示作用失去了,只是显示地指出变量是自动的
静态存储持续性变量提供了3种链接性
——5种变量存储方式——
| 存储描述 | 持 续 性 | 作 用 域 | 链 接 性 | 如何声明 |
|---|---|---|---|---|
| 自动 | 自动 | 代码块 | 无 | 在代码块中 |
| 寄存器 | 自动 | 代码块 | 无 | 在代码块中,使用关键字register |
| 静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字static |
| 静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 |
| 静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字static |
链接性为外部的变量简称外部变量,它们的存储持续性为静态,作用域为整个文件
“单定义规则”:变量只能有一次定义,C++提供了两种变量声明
//file01.cpp
int dogs=20;
//file02.cpp
extern int dogs;
C++提供了作用域解析运算符::,放在变量名前,表示使用变量的全局版本::dogs
存储说明符:
struct data
{
char name[30];
mutable int accesses;
};
const data veep={"Clodde",0};
strcpy(veep.name,"Joye");//not allowed
veep.accesses++; //allowed
cv-限定符
可以使用函数原型来指出要使用的约定
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
void * operator new(std::size_t);
void operator delete(void *);
void * operator new[](std::size_t);
void operator delete[](void *);
#include <new>
struct chaff
{
char dross[20];
int slag;
};
char buffer1[50];
char buffer2[500];
int main()
{
chaff *p1,*p2;
double *p3,*p4;
//常规内存分配
p1=new chaff;
p3=new double[20];
//指定内存分配
p2=new (buffer1)chaff;//从buffer1中分配空间给结构chaff
p4=new (buffer2)double[20];//从buffer2中分配空间给一个包含20个元素的double数组
cout<<"Memory address static: "<<(void*)p4<<endl;//不适用(void*)将显示一个字符串
return 0;
}
常规分配内存与指定内存的区别
调用接收两个参数的new()函数
int *pi=new int; //invokes new(sizeof(int))
int *p2=new(buffer) int; //invokes new(sizeof(int),buffer)
int *p3=new(buffer) int[40]; //invokes new(40*sizeof(int),buffer)
定位new函数不可替换,但可重载,第一个参数是std:size_t,指定了请求的字节数
提供声明名称的区域,一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西
使用关键字namespace创建名称空间
namespace Jack{
double pail;
void fetch();
}
Jack::fetch();//通过作用域解析运算符::访问给定名称空间中的名称
using声明和using编译指令
//using声明由被限定的名称和它前面的关键字using组成
using Jill::fetch;
using编译指令是可传递的
name space elements
{
namespace fire
{
int flame;
}
}
namespace myth
{
using Jill::fetch;
using namespace elements;
using std::cout;
}
std::cin>>myth::fetch;
//如果没有冲突的局部变量
using namespace myth;
cin>>fetch;
namespace
{
int ice;
}
该名称空间中声明的名称的潜在作用域为:从声明点到该声明区域末尾,可替代链接性为内部的静态变量