- include<>编译器会在存储标准头文件的文件系统查找,include""编译器会首先查找当前工作目录或者源文件目录。
- register在C++11中不在具有将变量放入寄存器的作用,但依然还可以使用。
- 定义在函数外面的变量为静态变量,而使用static修饰,那么只能在当前文件使用,不能链接到其他文件。
int global = 10;
//在所有文件都可以使用
//如果其他文件要使用这个变量,要使用extern关键词
// extern int global;
static int one_file = 30;
//只在当下文件使用。
int main()
{
static int ss = 20;
//作用域只是函数里面。
}
还可以使用static修饰函数使之只在单文件雷链接,函数默认外链接。
使用extern来声明其他文件的静态外链接变量。
static 变量在cpp文件可以访问。
存储说明符与cv-限定符。
存储说明符
- auto
- register
- static
- extern
- thread_local
//表明变量的持续性和所属线程的持续性相同。
- mutable
//为了突破const的限制而定义的关键字
cv-限定符
- const
- volatile
struct Test
{
int a;
mutable int b;
};
const struct Test test = {1,2};
test.a = 10; //编译错误
test.b = 20; //允许访问
- new分配的内存一直都可以在所以文件中使用。
直到他被delete。
char buffer[109];
new (buffer) typename variblename
它不检查内存是否使用,并将所有内存强制转化为void*,所以可以使用任意内存,而不用担心类型是否相同
定位new不需要使用delete,因为它本就没有消耗内存。如果buffer是用new开辟的空间,那么可以使用delete删除。
命名空间
- 通过namespace声明
namespace Jack
{
douoble pail;
void fetch();
int pail;
struct Node()
{
...
}
}
namespace Jill
{
double have(int n)
{
}
int slary;
}
- 命名空间是开放的,可以随时添加。
namespace Jill
{
char * goose(int age);
}
命名空间的使用
- 通过使用::作用域访问符使用命名空间中的成员。
- 通过使用using声明、using编译指令简化使用。
using Jill::slary;
//using声明使得jill中slary可用;
using namespace Jill;
//使得Jill中所有成员可用。
//using编译指令
如果出现了相同名称的变量,通过using声明导入的编译器会报错,
而通过using编译指令导入的,局部变量会覆盖命名空间。
- 命名空间支持嵌套,或在声明时候使用其他命名空间。
namespace element
{
namespace fire
{
int flame;
...
}
float water;
...
}
element:: fire:: flame = 10;
//使用变量。
namespace myth
{
using namespace element;
//任何包含myth的using编译指令都将包含element
using std:: cout;
//具有传递性
}
namespace m = myth;
//可以给命名空间起别名。
namespace
{
int ice;
...
}
//通过省略命名使得其中变量为文件内部链接。
//等价于下面。
static int ice;
...
命名空间使用建议
- 减少使用外部 全局变量,而将之放在命名空间中。
- 将函数库或者类库放在命名空间中。
- 不要在头文件中使用using编译指令。
- 首选使用::或者using声明,减少使用using编译指令。
- 尽量将using设置为局部作用域。