当前位置: 首页 > news >正文

推广优化网站网站栏目方案

推广优化网站,网站栏目方案,长沙哪里有做网站的公司,wordpress教程 aliyun转载自C/C中static的用法全局变量与局部变量 1.什么是static? static 是C/C中很常用的修饰符#xff0c;它被用来控制变量的存储方式和可见性。 1.1static的引入 我们知道在函数内部定义的变量#xff0c;当程序执行到它的定义处时#xff0c;编译器为它在栈上分配空间中static的用法全局变量与局部变量 1.什么是static?   static 是C/C中很常用的修饰符它被用来控制变量的存储方式和可见性。 1.1static的引入   我们知道在函数内部定义的变量当程序执行到它的定义处时编译器为它在栈上分配空间函数在栈上分配的空间在此函数执行结束时会释放掉这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时如何实现 最容易想到的方法是定义为全局的变量但定义一个全局变量有许多缺点最明显的缺点是破坏了此变量的访问范围使得在此函数中定义的变量不只受此函数控制。static关键字则可以很好的解决这个问题。 另外在C中需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部对外不可见时可将其定义为静态数据。 1.2静态数据的存储   全局静态存储区分为DATA段和BSS段。DATA段全局初始化区存放初始化的全局变量和静态变量BSS段全局未初始化区存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BSS段在程序执行之前会被系统自动清0所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化也是唯一的一次初始化。 在C中static的内部实现机制静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用所以静态数据成员不能在任何函数内分配空间和初始化。        这样它的空间分配有三个可能的地方一是作为类的外部接口的头文件那里有类声明二是类定义的内部实现那里有类的成员函数定义三是应用程序的main()函数前的全局数据声明和定义处。       静态数据成员要实际地分配空间故不能在类的声明中定义只能声明数据成员。类声明只声明一个类的“尺寸和规格”并不进行实际的内存分配所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义因为那会造成在多个使用该类的源文件中对其重复定义。       static被引入以告知编译器将变量存储在程序的静态存储区而非栈上空间静态数据成员按定义出现的先后顺序依次初始化注意静态成员嵌套时要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。优势可以节省内存因为它是所有对象所公有的因此对多个对象来说静态数据成员只存储一处供所有对象共用。静态数据成员的值对每个对象都是一样但它的值是可以更新的。只要对静态数据成员的值更新一次保证所有对象存取更新后的相同的值这样可以提高时间效率。 2.在C/C中static的作用 2.1总的来说 1生命周期在修饰变量的时候static修饰的静态局部变量只执行初始化一次而且延长了局部变量的生命周期直到程序运行结束以后才释放但不改变作用域。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰。 2可见性static修饰全局变量或函数时这个全局变量只能在本文件中访问不能在其它文件中访问即便是extern外部声明也不可以。这个函数也只能在本文件中调用不能被其他文件调用。 3存储方式Static修饰的变量存放在全局数据区的静态变量区包括全局静态变量和局部静态变量都在全局数据区分配内存。初始化的时候自动初始化为0。 4考虑到数据安全性当程序想要使用全局变量的时候应该先考虑使用static。 2.2静态变量与普通变量 静态全局变量有以下特点 1静态变量都在全局数据区分配内存包括后面将要提到的静态局部变量; 2未经初始化的静态全局变量会被程序自动初始化为0在函数体内声明的自动变量的值是随机的除非它被显式初始化而在函数体外被声明的自动变量也会被初始化为0 3静态全局变量在声明它的整个文件都是可见的而在文件之外是不可见的。 优点静态全局变量不能被其它文件所用其它文件中可以定义相同名字的变量不会发生冲突。 4全局变量和全局静态变量的区别 1全局变量是不显式用static修饰的全局变量全局变量默认是有外部链接性的作用域是整个工程在一个文件内定义的全局变量在另一个文件中通过extern 全局变量名的声明就可以使用全局变量。 2全局静态变量是显式用static修饰的全局变量作用域是声明此变量所在的文件其他的文件即使用extern声明也不能使用。 2.3静态局部变量有以下特点 1该变量在全局数据区分配内存 2静态局部变量在程序执行到该对象的声明处时被首次初始化即以后的函数调用不再进行初始化 3静态局部变量一般在声明处初始化如果没有显式初始化会被程序自动初始化为0 4它始终驻留在全局数据区直到程序运行结束。但其作用域为局部作用域当定义它的函数或语句块结束时其作用域随之结束。 一般程序把新产生的动态数据存放在堆区函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间静态数据即使是函数内部的静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。//example: #include stdio.h #include stdlib.h int k1 1; int k2; static int k3 2; static int k4; int main() {static int m1 2, m2;int i 1;char*p;char str[10] hello;char*q hello;p (char *)malloc(100);free(p);printf(栈区-变量地址 i%p\n, i);printf(栈区-变量地址 p%p\n, p);printf(栈区-变量地址 str%p\n, str);printf(栈区-变量地址 q%p\n, q);printf(堆区地址-动态申请%p\n, p);printf(全局外部有初值 k1%p\n, k1);printf( 外部无初值 k2%p\n, k2);printf(静态外部有初值 k3%p\n, k3);printf( 外静无初值 k4%p\n, k4);printf( 内静态有初值 m1%p\n, m1);printf( 内静态无初值 m2%p\n, m2);printf( 文字常量地址%p, %s\n, q, q);printf( 程序区地址%p\n, main);return 0; }3.1特别的在C中 static关键字最基本的用法是 1、被static修饰的变量属于类变量可以通过类名.变量名直接引用而不需要new出一个类来 2、被static修饰的方法属于类方法可以通过类名.方法名直接引用而不需要new出一个类来 被static修饰的变量、被static修饰的方法统一属于类的静态资源是类实例之间共享的换言之一处变、处处变。 在C中静态成员是属于整个类的而不是某个对象静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则保证了安全性还可以节省内存。 静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即类名::静态成员名。 3.2静态类相关 //example1通过类名调用静态成员函数和非静态成员函数class Point{public:void init(){}static void output(){}};void main(){Point::init();Point::output();}报错 Point::init : illegal call of non-static member function 结论1不能通过类名来调用类的非静态成员函数。 //example2通过类的对象调用静态成员函数和非静态成员函数class Point{public:void init(){}static void output(){}}; void main() {Point pt;pt.init();pt.output(); }编译通过。 结论2类的对象可以使用静态成员函数和非静态成员函数。 //example3:在类的静态成员函数中使用类的非静态成员 #include stdio.h class Point { public:void init(){}static void output(){printf(%d\n, m_x);} private:int m_x; }; void main() {Point pt;pt.output(); }编译出错error C2597: illegal reference to data member Point::m_x in a static member function 因为静态成员函数属于整个类在类实例化对象之前就已经分配空间了而类的非静态成员必须在类实例化对象后才有内存空间所以这个调用就出错了就好比没有声明一个变量却提前使用它一样。 结论3静态成员函数中不能引用非静态成员。 //example4在类的非静态成员函数中使用类的静态成员 class Point { public:void init(){output();}static void output(){} }; void main() {Point pt; Pt.init();pt.output(); }编译通过。 结论4类的非静态成员函数可以调用用静态成员函数但反之不能。 //example5:使用类的静态成员变量#include stdio.hclass Point{public:Point(){m_nPointCount;}~Point(){m_nPointCount--;}static void output(){printf(%d\n, m_nPointCount);}private:static int m_nPointCount;};void main(){Point pt;pt.output();}按CtrlF7编译无错误按F7生成EXE程序时报链接错误 error LNK2001: unresolved external symbol private: static int Point::m_nPointCount (?m_nPointCountPoint0HA) 这是因为类的静态成员变量在使用前必须先初始化。 在main()函数前加上int Point::m_nPointCount 0; 再编译链接无错误运行程序将输出1。 结论5类的静态成员变量必须先初始化再使用。 思考总结静态资源属于类但是是独立于类存在的。从J类的加载机制的角度讲静态资源是类初始化的时候加载的而非静态资源是类实例化对象的时候加载的。 类的初始化早于类实例化对象比如Class.forName(“xxx”)方法就是初始化了一个类但是并没有实例化对象只是加载这个类的静态资源罢 了。所以对于静态资源来说它是不可能知道一个类中有哪些非静态资源的但是对于非静态资源来说就不一样了由于它是实例化对象出来之后产生的因此属于类的这些东西它都能认识。所以上面的几个问题答案就很明确了 1静态方法能不能引用非静态资源不能实例化对象的时候才会产生的东西对于初始化后就存在的静态资源来说根本不认识它。 2静态方法里面能不能引用静态资源可以因为都是类初始化的时候加载的大家相互都认识。 3非静态方法里面能不能引用静态资源可以非静态方法就是实例方法那是实例化对象之后才产生的那么属于类的内容它都认识。 static修饰类这个用得相对比前面的用法少多了static一般情况下来说是不可以修饰类的 如果static要修饰一个类说明这个类是一个静态内部类注意static只能修饰一个内部类也就是匿名内部类。像线程池 ThreadPoolExecutor中的四种拒绝机制CallerRunsPolicy、AbortPolicy、DiscardPolicy、 DiscardOldestPolicy就是静态内部类。静态内部类相关内容会在写内部类的时候专门讲到。 3.3总结 1静态成员函数中不能调用非静态成员。 2非静态成员函数中可以调用静态成员。因为静态成员属于类本身在类的对象产生之前就已经存在了所以在非静态成员函数中是可以调用静态成员的。 3静态成员变量使用前必须先初始化(如int MyClass::m_nNumber 0;)否则会在linker时出错。 参考http://blog.csdn.net/morewindows/article/details/6721430 一般总结在类中static可以用来修饰静态数据成员和静态成员方法 静态数据成员 1静态数据成员可以实现多个对象之间的数据共享它是类的所有对象的共享成员它在内存中只占一份空间如果改变它的值则各对象中这个数据成员的值都被改变。 2静态数据成员是在程序开始运行时被分配空间到程序结束之后才释放只要类中指定了静态数据成员即使不定义对象也会为静态数据成员分配空间。 3静态数据成员可以被初始化但是只能在类体外进行初始化若未对静态数据成员赋初值则编译器会自动为其初始化为0 4静态数据成员既可以通过对象名引用也可以通过类名引用。 静态成员函数 1静态成员函数和静态数据成员一样他们都属于类的静态成员而不是对象成员。 2非静态成员函数有this指针而静态成员函数没有this指针。 3静态成员函数主要用来方位静态数据成员而不能访问非静态成员。
http://www.zqtcl.cn/news/236760/

相关文章:

  • 承德网站制作公司哪家好公司网络组建方案模板
  • 用wordpress 建网站网站关键词怎么改
  • 怎么做网站做站点创建站怎么上传网站怎么办
  • 十堰网站建设专家html做的旅游网站
  • 网站项目上线流程网站改版需求说明
  • 网站建设制作公司xshell如何做网站
  • 义乌个人兼职做建设网站琼海做网站公司
  • 什么网站可以直接做word在柬埔寨做网站彩票推广
  • 深圳市宝安区住房和建设局网站校园网络方案设计
  • 株洲建设网站制作seo快速软件
  • 建站什么程序好wordpress返佣
  • 网站建设使用虚拟主机的优点与缺点马蹄室内设计论坛
  • 像wordpress一样的网站wordpress提示数据库出错
  • 优化网站首页新项目首码对接平台
  • 一个完整的网站建设过程wordpress企业中文模板下载
  • 我做微信淘宝客网站有哪些在公司做网站是什么职位
  • 湖南网站建设公司 干净磐石网络网站开发技术可行性分析怎么写
  • 石家庄制作网站网络推广与优化
  • 建站平台免代码可以自己设计图案的软件
  • 中山网站开发公司事业单位 网站备案
  • wordpress 做用户登录seo快速推广窍门大公开
  • php网站开发试卷做外贸一般在哪个网站
  • 有哪些网站的搜索引擎网站设计需要需要用
  • 网站建设有哪些需求徐州百度运营中心
  • 怎么做电脑网站后台杭州网站制作公司排名
  • 济南手机网站定制价格wordpress前端登陆 投稿
  • 建设企业网站的原因网站开发项目经验和教训
  • 京东网站的建设与发展现状分析手机与pc网站同步模板
  • 枣阳网站建设吧yw最新域名备案查询
  • 西安知名网站建设公司什么网站可以分享wordpress