auto类型表示自动存储类型 :? 就是系统自动分配内存,使用结束后系统回收。?
其实auto类型就是我们平时定义的局部变量,所以我们定义一个auto类型的变量,加auto都可以。?
{
auto int a = 10;
}
上面这行代码, 其实和 int a = 10; 是一样的。????
但是,??
在C语言中,加不加auto都没有问题,不会报错。
在c++中,如果加了auto,是会报错的,因为c++中对auto进行了升级(有了一定的功能),并不是像C语言那样可写可不写。
?
?1. register类型表示寄存器类型, 顾名思义就是使用该类型定义的变量可以放到寄存器中(但并不是一定)。
寄存器是用来临时存储数据的, 因为其的执行速度比内存快的多,但是空间很小,所以一般将使用频率高的放到寄存器中,以提高效率。?鉴于这一点,我们可以在定义变量的时候,加register关键字,但是它不一定会被放到寄存器中,因为前面说了,放的都是频繁使用的,你随便定义一个数据,但是它整个程序就用一次,放进去不是浪费资源吗,或者,你定义之后,寄存器没有空间了,你当然也放不进去,所以并不是只要用register定义的变量都会往寄存器里面放。?
2. ?既然register定义的变量可能在寄存器中(即使它最后没有放到寄存器中),寄存器中是没有地址的,所以我们不能对register的变量进行寻址。(即使它最后没有放进去也不能)? ------? C语言
? ? 鉴于上面的情况c++进行了一些改变,?当你对寄存器变量进行取地址时,c++会将其降级为一个自动变量,自动变量当然在内存中存储,也有地址。 ------- c++
? ? 综上,对寄存器变量寻址,C语言不允许,c++允许。?
?
说到这个类型,就要提到全局变量了,?
main.cpp:
int a = 10;
main1.cpp:
extern int a;
上面代码,main.cpp和main1.cpp是一个项目的两个源文件。?
在 main.cpp中定义了一个全局变量, 这个全局变量不仅可以在此源文件中使用,也可以在该项目的其它源文件中使用。?
而我们在其它源文件中使用别的源文件中的全局变量,就需要加一个声明,告诉编译器我们使用的这个变量是引用的外面文件的,这时候就需要使用extern关键字了。?
extern int a; 就是告诉编译器,如果没有定义一个变量a,那么这个a使用的是其它源文件的外部变量。?
注意: 如果使用extern不能对其初始化,如果初始化了,就表示在本源程序中定义了一个变量,而不是引用外部变量了。
例:? extern int a = 10; 这个就是在main1.cpp中定义了一个全局变量a(同一个项目中的各个源程序的全局变量名不能相同)。?
?
?前面说到extern关键字,可以使用别的源文件定义的全局变量,那么如果不想让别的源文件使用我们的全局变量,那么直接在顶以前加上static就可以了。?
将static作用在局部变量上,那么它的生命周期就和程序一样了,但是只能作用域定义它的块内。?
void age()
{
int age_boy = 1;
}
上面的函数中,我们想要每次调用函数,给age_boy加1,如果就像上面代码所示,是无法实现的,因为每次调用函数都重新定义,它的初始值永远都为1,但是我们加上static就不一样了,此时只有第一次调用函数会定义该变量,每次调用函数对其+1都是对上次的数据+1。?