版权声明:K5出品,必属精品,欢迎收藏评论 https://blog.csdn.net/a694861283/article/details/90206490
一.四大修饰类型
变量根据作用域可分为全局变量和局部变量
变量根据生存周期可以分为静态存储方式和动态存储方式.
外部(全局)变量(extern)\静态外部变量(static)\静态局部变量(static)存储在静态存储区(用静态存储方式),在程序整个运行期间都不释放
自动局部变量(默认auto)\函数形参存储在动态存储区(用动态存储方式),函数调用完就释放
寄存器变量(register)存储在CPU寄存器中,而不是内存
每一个变量都有作用域和存储类别两个属性
二.auto
1.C用法
auto声明的变量为自动变量,拥有自动的生命期,默认可以不写
int a=1; //拥有自动生命期
auto int a=2; //拥有自动生命期
static int a=3; //延长了生命期
2.C++用法
在C++11标准中,auto用于声明变量的时候,根据变量的初始值的类型自动为此变量选择匹配的类型
int a=1;
auto b=a; //自动类型推断,b为int类型
cout<<typeid(b).name()<<endl;
auto的自动类型推断发生在编译器,使用不会造成程序运行时效率降低
auto变量必须在定义时初始化,类似const
(1)简化代码
std::vector<std::string> vs;
for(std::vector<std::string>::iterator i=vs.begin();i!=vs.end();i++){
}
相当于
for(auto i=vs.begin();i!=vs.end();i++){
}
(2)用于模板函数的参数或返回值
template <typename _Tx,typename _Ty>
void Multiply(_Tx x,_Ty y){
auto v=x*y;
std::cout<<v;
}
auto Multiply(_Tx x,_Ty y)->decltype(x*y)
{
return x*y;
}
三.static
1.作用
Const修饰的类型跟它本身的内存值有关,而Static修饰的类型跟它内存生命周期有关
只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格
(1)对其他源文件隐藏
(2)保持变量内存的持久,保持唯一性,只占一份内存
(3)默认初始化为0
2.C用法
(1)修饰局部变量
保持内存的持久(保持唯一性,只占一份内存)
void A(){
//普通局部变量存储于进程栈空间,使用完毕后会立即释放
//静态局部变量编译器会默认初始化为0,存储于进程的全局数据区,程序结束时释放
static int a=1;
}
(2)修饰全局变量
对其他源文件隐藏
//全局变量本身就有内存的持久性,所以静态全局变量用于在其他源文件屏蔽该变量
//全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化
//普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用,也就是说其他文件不能定义一个同名的变量
//静态全局变量仅对其当前文件可见,其他文件不可访问,其他文件可以拥有同名的变量
//file1.cpp
int varA;
static int varB;
//file2.cpp
extern int varA; //使用其他源文件的全局变量
extern int varB; //错误,静态全局变量被屏蔽
(3)修饰全局函数
对其他源文件隐藏
//非静态函数可以在另一个文件中直接引用不必加extern声明
//静态函数只能在声明它的文件中可见,其他文件不能引用该函数
//不同的文件可以使用相同名字的静态函数
//file1.cpp
extern void funA(){}
static void funB(){}
//file2.cpp
extern void funA(); //使用其他源文件的全局变量
extern void funB(); //错误,静态全局函数屏蔽了该函数
3.C++用法
(1)修饰类的静态成员变量
默认初始化为0,保持内存的持久(保持唯一性,只占一份内存)
//静态成员可以独立访问,无须创建任何对象实例就可以访问
//静态成员变量每个class只有一份变量内存(全局数据区/静态区),而普通成员函数每个对象都有不同的变量内存
//test.h
class A{
private:
static const int a;
}
//test.cpp
const int A::a=1; //不受private和protected访问限制
(2)修饰类的静态成员函数
保持内存的持久(保持唯一性,只占一份内存)
//类的静态成员函数无法调用类的非静态成员函数和变量,因为静态成员函数没有this指针
//类的非静态成员函数可以调用类的静态成员函数和变量
//静态成员函数不可以同时声明为virtual const volatile函数
class A{
public:
virtual static void fun1(); //错误
static void fun2() const; //错误
static void fun2() volatile; //错误
};