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. nginx访问白名单设置以及根据$remote_addr分发

    在日常运维工作中,会碰到这样的需求:设置nginx的某个域名访问只对某些ip开放,其他ip的客户端都不能访问.达到这样的目的一般有下面两种设置方法:(1)针对nginx域名配置所启用的端口(一般是80 ...

  2. windows下安装memcache的基本步骤

    本文主要解决的是window下memcached的安装的问题,在使用的过程中经常会被第一步环境的配置搞混,本文结合我的配置过程和遇到的问题,做一个总结 1,开启php memcache的扩展,在文件  ...

  3. Shell脚本语法

      索引 1. 第一行必须是"#!/bin/sh" 2. 注释:一行开头为 # 3. 定义变量 4. 逻辑符号 5. 接收参数 6. 控制流:if/then/elif/else/f ...

  4. XMLHTTPRequest/Ajax请求 和普通请求的区别

    Ajax请求头会多一个x-requested-with参数,值为XMLHttpRequest 详情:http://blog.csdn.net/zhangdaiscott/article/details ...

  5. ROS(Robot Operating System)常用环境变量介绍

    本文简单介绍ROS系统中常用的环境变量用途及设置方式.ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等. ...

  6. ios蓝牙开发(五)BabyBluetooth蓝牙库介绍

    BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你 ...

  7. Expression Blend4经验分享:制作一个简单的文字按钮样式

    首先在Grid里放一个TextBlock,对象时间线窗口的结构树如下 右键点击grid,选择构成控件 会弹出构成控件的对话框,选择你要构成的控件类型,控件名称,控件样式存储位置 这里我们选择butto ...

  8. jQuery学习笔记(二):this相关问题及选择器

    上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理解的,this就是指代当前操作的DOM对象. 在jQuery中,this可以用于单 ...

  9. 仿各种APP将文章DOM转JSON并在APP中以列表显示(android、ios、php已开源)

    背景 一直以来都想实现类似新闻客户端.鲜城等文章型app的正文显示,即在web editor下编辑后存为json,在app中解析json并显示正文. 网上搜过,没找到轮子.都是给的思路,然后告知是公司 ...

  10. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...