1.单独编译与头文件的连接
#ifndef TEST_H //当前头文件名,下面都是
#define TEST_H
extern int a ; //调用方法
extern int d ; //方法一样
extern void a(int ,double ) ; //调用方法
........
#endif // TEST_H
这样定义的好处还有防止重复调用
多个库的调用最好用同一个编译器编译!
2.存储的连续性
2.1 自动存储的连续性:相当于创建的临时变量,代码块结束后自动释放
2.2 静态存储的持续性:函数块之外存储的变量和或者static定义的变量,全过程为静态
2.3线程存储的持续性:多线程中存在
2.4动态存储的持续性:new的动态分配内存(堆)//记得释放
2.5作用域:局部和全局//代码块内和代码块外
2.6链接:共享性(局部和全局)||(内部名称的共享性)
2.7局部变量与外部变量冲突时会隐藏外部变量
2.8自动变量和栈:常规变量定义在栈上,根据长度从下往上分配空间,在结束后会被自动释放,顺序时从上往下
写点代码
......
int d; //创建连接性为外部的静态持续变量
//可以定义重名但连接性为内部的变量,但我觉得没什么用而且麻烦
static int a ;//创建连接性为内部的静态持续变量
extern k ; //也可以这样定义,不限数量
extern void a ( int ,double ) ; //本来就用来全局链接
int main () {
static int b;//无连接性静态持续变量
......
for(...){
static int c ;//无连接性的静态持续变量
......
}
return 0 ;
}
//只要在代码块内的就没链接性了
2.9静态初始化和动态初始化
2.10 单定义规则,全局变量,在另一个文件中用
extern int a ; 来访问链接性变量emmm不想测试了
2.11 不能定义两个2个同名全局变量
2.12 最好一次只定义一个外部变量
2.13关键字extern (见代码)
2.14关键字volatile:和并发扯上关系,但是其基本作用时不让编译器自动优化程序 ,定义时定义在所需变量最前面就好了
2.15关键字mutable
简单说一下,只要用它当前缀声明的变量就算在private成员里也能被直接修改,就算在外部定义了一个该类的const对象,该成员还是能被随意修改。
相对来说,mutable 这个关键字用的地方不多。了解这些也就够了
2.16const限定符再谈
被const修饰过的变量的链接性永远为内部,然而也可以用extern关键词来访问,具体方法就是在定义的最前面加上该关键字
2.17语言的连接性:重载函数可以被默认设置为不同的函数名放入内存,如果要在c++中使用c的预编函数:
”c++" void ...
等价于 void ...
"c" void...
3.使用new来动态分配内存
int*pt=new int(6) ; //或者 = new int {6} c++11 列表初始化法
A*one = new A ; //A为列表
4.定位new运算符
new的重载版本
include<new>
int buffer =100 ;//整形占内存恒为4
int*p2 = new(buffer)int ;
class JustTesting {....} ;
JustTesting *pc1 = new (buffer)JustTesting("Bad Idea", 6); //将pc1的内存指向buffer
//但是会出现问题
pc3 = new (buffer+sizeof(JustTesting)) JustTesting("Better Idea",6);
//这里为其准备了额外的空间防止内存外溢
再次阐述一下内存的内涵:
内存是一块内存空间,不同种类的数据类型所需要的空间大小就不同,改变类型值不会影响内存大小(在范围内) ,new的时候定义的变量为指针,指针指向了对应大小的内存,而这个指针独立出来放在一块特定的位置,其大小由操作系统决定,一般为4字节。
5.名称空间namespace和using指令的使用
namespace a { int b = 100 ; char c ; }
namespace a { int c = 120 ; } //可这样补充内容
a::c = 'a' ;//访问内容
using a:: b ; //调用b
namespace b { using std :: cout ; using std::cin }
using namespace b ; //调用b中所有元素
namespace i {
namespace b { int a = 10 ;} ;
} ;
using i::b::a ; //嵌套使用namespace
namespace b { int a = 10 ; int c = 100 ;} ;
namespace k {
using namespace b ;
int g = a + 10;
} ;
using namespace k ;
cout<< g <<endl ;//在另一个namespace中调用一个namespace中的内容
cout<<c <<end ; //默认调用了b名称空间
namespace b = a ; //起别名
namespace A= b::c ; //给b中的c起别名
创建一个没有名称的命名空间
static int counts = namespace { int counts ; } ; //这里的等于指等价于,也就是等价于一个static变量参考@3
注意!
@1:声明后如果出现重名则编译失败
@2:如果函数中出现与namespace中相同变量则隐藏namespace的重名元
在安全性方面,using单独编译指令比直接全部直接调用std好得多
@3
关于无名字的名称空间
由于没有名字,所以其它文件无法引用,它只能在本文件的作用域内有效,
它的作用域:重无名命名空间声明开始到本文件结束。在本文件使用无名命名空间成员时不必用命名空间限定。其实无名命名空间和static是同样的道理,都是只在本文件内有效,无法被其它文件引用。
第九章到此结束