static,即静态声明。它在 作用域、存储方式、生命周期 等各方面影响一个变量或函数。文章将从 局部变量、全局变量、普通函数、类的static成员(包括数据成员与成员函数)来总结static。

  • 全局变量

     所有的全局变量,无论是否是static的,都是存储于静态存储区的。全局变量本身就是静态存储方式,将全局变量声明为static是为了将变量的作用域限制在本翻译单元中(本源文件中),使该全局变量不能被源程序的其他翻译单元所引用。普通全局变量使用extren声明可以拓展其作用域至其他翻译单元中。

   可以总结为:static改变了全局变量的作用域,而不改变变量的存储位置与生命周期。  

  • 局部变量   

    局部变量即在函数内定义的或在块中定义的变量。static对局部变量的作用不同于全局变量。普通局部变量在离开其作用域(如离开定义它的函数或块的花括号)时即消失,而static变量却存在于程序运行的整个过程,也即是说,static声明改变了局部变量的生命周期。普通局部变量是存储在动态存储区的(堆),而static局部变量是存储在静态存储区,因而普通局部变量在函数每次被调用时都被重新分配内存地址,而静态局部变量则在程序运行过程中占据固定的内存。

   可以总结为:static改变了局部变量的存储方式与生命周期,而不改变变量的作用域。

  • 普通函数

   这里的普通函数是为了与类的成员函数区别开来。函数在定义时默认是外部的,通过extren声明即可被其他源文件引用,static声明将函数的作用域限制在本翻译单元中,成为内部函数。static函数在内存中只有一份,普通函数在每个调用中维持一份拷贝。

  可以总结为:static使得函数在内存中只有一份,并将函数作用域限制在当前源文件。

   另外,static有几个优点总被提起:

    1. 避免了链接时与其他源文件中的变量命名引起冲突。

      2.对于c函数而言,static对函数进行了信息屏蔽,只给当前文件中其他函数使用。

  • 类static成员

  static声明对类成员的作用可以这样概括:static使得成员从“属于类对象”变成了“属于类,而不属于类对象”。

  对于数据成员:

    1.static数据成员必须在类定义体的外部进行定义。

class BOOK
{
private:
//折扣
static float discount;
};
//在类定义体外部定义并初始化
float BOOK::discount = 0.95f;

    2.不像普通数据成员,static数据成员不能在构造函数中进行初始化。正如上面所说,它只能在类外部定义并初始化。然而有一个例外,整型的const static 数据成员可以在类的定义体中进行初始化。但需注意的是,const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义(不必再指定初始值了)。

class BOOK
{
private:
//折扣
const static int discount=;
};
const int BOOK::discount;
  • 类static成员函数

  在类内部声明的static成员函数,在类定义体外部进行定义时无须重复指定static关键字。

  对于static成员函数,它同样是不属于类对象的,因而它没有this指针。它可以直接访问类的static数据成员,不能直接使用非static成员,原因是非static数据成员属于类对象,使用非static数据成员时必须通过this指针来确定是这些成员属于哪个类对象,然而上面说了,static成员函数没有this指针。

  static成员函数不能被声明为const。实际上,成员函数被声明为const的本质是它向编译器保证不会通过这个函数来修改类对象在内存中的每一个bit的内容(可以看《effective C++》 条款03 “尽可能使用const” ),然而我们知道,static成员函数并不属于类对象,更谈不上要保证不修改某一对象的内存了。

  另外,虚函数不能为声明为static,为什么呢?原因还是static成员函数没有this指针。virtual funtion运行时绑定是多态的基础,没有this指针多态的概念无法践行。  

PS:如果文章内容有错误,恳请指出,万分感谢。

static关键字总结的更多相关文章

  1. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  2. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  3. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  4. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  5. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  6. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  7. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  8. static关键字

    static关键字 static是静态修饰符,一般修饰成员.被static修饰的成员属于类,不属于单个这个类的某个对象. 1.static关键字的特点 a:随着类的加载而加载 b:优先于对象存在 (还 ...

  9. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  10. (转)Java中的static关键字解析

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

随机推荐

  1. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  2. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  3. netcore 控制台中文乱码

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.Get ...

  4. Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理

    经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...

  5. Spring Security笔记:使用数据库进行用户认证(form login using database)

    在前一节,学习了如何自定义登录页,但是用户名.密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一.项目结构 与前面的示例相比,因为 ...

  6. 2014-2015-2 《Java程序设计》课程学生博客列表

    20135101 曹钰晶 20135103 王海宁 20135104 刘 帅 20135105 王雪铖 20135109 高艺桐 20135111 李光豫 20135114 王朝宪 20135116 ...

  7. "Timeout"在测试框架里是如何被实现的

    今天组里的小伙伴问了我一个问题:“我这里有一个底层驱动的接口,我想在测试它的时候加上超时限制,时间一过就fail掉它,执行后面的测试用例.怎么办到呢?”.我问:“它自己没有超时响应的机制么? 超时抛e ...

  8. 【监控】WebServer入库与缓存更新代码优化小计

    问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...

  9. [云上天气预报-有时有闪电]2月3日23:00-4:00阿里云SLB升级期间网络会闪断

    大家好,2月3日23:00-2月4日4:00,阿里云将对SLB(负载均衡)进行升级,在升级期间,SLB会有约4-8次的网络闪断.由此给您带来麻烦,望谅解! 阿里云官方公告内容如下: 尊敬的用户: 您好 ...

  10. nodejs学习之实现http数据转发

    此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...