C89:论四大生命周期修饰类型

C89:论四大生命周期修饰类型,第1张

概述一.四大修饰类型(auto/static/extern/register) 变量根据作用域可分为全局变量和局部变量 变量根据生存周期可以分为静态存储方式和动态存储方式. 外部(全局)变量(extern)\静态外部变量(static)\静态局部变量(static)存储在静态存储区(用静态存储方式),在程序整个运行期间都不释放 自动局部变量(默认auto)\函数形参存储在动态存储区(用动态存储方式), 一.四大修饰类型(auto/static/extern/register)

变量根据作用域可分为全局变量和局部变量

变量根据生存周期可以分为静态存储方式和动态存储方式.

外部(全局)变量(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.作用

@H_403_80@Const修饰的类型跟它本身的内存值有关,而Static修饰的类型跟它内存生命周期有关

只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格

(1)对其他源文件隐藏

(2)保持变量内存的持久,保持唯一性,只占一份内存

(3)默认初始化为0

@H_403_80@注意:形参不能被static修饰

 

2.C用法 (1)修饰局部变量

保持内存的持久(保持唯一性,只占一份内存)

voID A(){        //普通局部变量存储于进程栈空间,使用完毕后会立即释放    //静态局部变量编译器会默认初始化为0,存储于进程的全局数据区,程序结束时释放    static int a=1;}

 

(2)修饰全局变量

对其他源文件隐藏

//全局变量本身就有内存的持久性,所以静态全局变量用于在其他源文件屏蔽该变量 //全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化//普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用,也就是说其他文件不能定义一个同名的变量//静态全局变量仅对其当前文件可见,其他文件不可访问,其他文件可以拥有同名的变量  //file1.cppint vara;static int varB; //file2.cppextern 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,保持内存的持久(保持唯一性,只占一份内存),不存在this指针

//静态成员可以独立访问,无须创建任何对象实例就可以访问//静态成员变量每个class只有一份变量内存(全局数据区/静态区),而普通成员函数每个对象都有不同的变量内存 //test.hclass A{    private:        static const int a;} //test.cppconst 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;   //错误};

 

三.Extern

 

四.Register 总结

以上是内存溢出为你收集整理的C89:论四大生命周期修饰类型全部内容,希望文章能够帮你解决C89:论四大生命周期修饰类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存