【C++自我精讲】基础系列四 static

0 前言

变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式。

1)动态存储方式的变量,生存期为变量所在的作用域。即程序运行到此变量时才为其分配存储空间,作用域结束时,会自动收回为其分配的存储空间。

2)静态存储方式的变量,生存期为整个程序执行的过程。即程序开始时就为其分配存储空间,程序结束时,才会收回为其分配的存储空间。

4种变量的存储类型:

1)自动类型(auto):动态存储方式的变量,局部变量,auto常常省略。

2)寄存器类型变量(register):动态存储方式的变量,编译器不为此类型变量分配存储空间,而是直接使用CPU的寄存器。存取速度快,主要用于控制循环次数等不需要长期保存值的变量。

3)外部类型变量(extern):静态存储方式的变量,系统自动初始化值,又叫全局变量,全局变量是从作用域提出的,外部变量是从存储方式提出的,表示了它的生存期。

4)静态存储变量(static):静态存储方式的变量,系统自动初始化值,静态变量只能在它的作用范围内使用。

1 static用法

static:静态存储变量的类型说明符。

static局部变量:在函数内的局部变量类型说明符前加上static说明符就构成静态局部变量。局部变量变为静态局部变量,即改变了它的生存期。

void Fun()
{
static int i; //static局部变量
...
}

1)static局部变量在函数内定义。

2)static局部变量的生存期是整个程序。

3)static局部变量的作用域为函数体内。但再次调用定义此函数时,又可继续使用此变量,而且保存了前次被调用后留下的值。

int Fun1()
{
int i = ; //局部变量
i++;
return i;
}
int Fun2()
{
static int i; //static局部变量
i++;
return i;
}
int main(int argc, char* argv[])
{
int iRet = ;
iRet = Fun1(); //iRet = 1;
iRet = Fun1(); //iRet = 1;
iRet = Fun2(); //iRet = 1;
iRet = Fun2(); //iRet = 2;
return ;
}

static全局变量:在全局变量类型说明符前加上static就构成静态的全局变量。全局变量变成静态全局变量,即改变了它的作用域。

1)当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量要在其它的源文件中使用,在使用前就用extern进行外部声明。

2)如果在一个源文件中定义的外部变量不想让其它源文件使用,则必须声明为static全局变量,只能供所在的源文件使用。同时可以避免在其它源文件中引起错误。

//全局变量
file1.cpp
int gNum;
main()
{
gNum++;
} file2.cpp
extern int gNum;
main()
{
gNum++;
} //static全局变量
file3.cpp
static int gNum;
main()
{
gNum++;
}

static类成员变量:类的所有对象都用同一个static成员变量。通过对象名或类名都可以调用。

class A
{
public:
static int x;
int y;
}; A a1,a2; //创建了两个A的对象
a1.x = ; //A::x = 1;或a2.x = 1;一样,都是对static int x;操作,x = 1;
a1.y = ; //a1对象里面y = 1;
a2.y = ; //a2对象里面y = 2;

 static类成员变量和普通数据成员一样,不能在类的定义体中初始化,只能在类外进行初始化。但static const却可以。

int y = ;
class A
{
public:
static const int x = ;
static int y;
};

static类成员函数:类的所有对象都用同一个static成员函数。通过对象名或类名都可以调用。

1)static类成员函数没有this指针。

2)static类成员函数不能被声明为const和虚函数。

3)static类成员函数可以访问所属类的static成员变量,但不能使用非static成员变量。

class A
{
public:
static int x;
int y;
static void Fun(); //static成员函数
};
static void Fun()
{
x++; //可以
y++; //不可以
} A a1;
a1.Fun(); //或A::fun();

【C++自我精讲】基础系列四 static的更多相关文章

  1. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...

  2. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  3. 【C++自我精讲】基础系列六 PIMPL模式

    [C++自我精讲]基础系列六 PIMPL模式 0 前言 很实用的一种基础模式. 1 PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implemen ...

  4. 【C++自我精讲】基础系列五 隐式转换和显示转换

    [C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...

  5. 【C++自我精讲】基础系列三 重载

    [C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...

  6. 夯实基础系列四:Linux 知识总结

    前言 前三节内容传送门: 夯实基础系列一:Java 基础总结 夯实基础系列二:网络知识总结 夯实基础系列三:数据库知识总结 现在很多公司项目部署都使用的是 Linux 服务器,互联网公司更是如此.对于 ...

  7. es6基础系列四--字符串的拓展

    1 for...of 字符串的遍历接口 for(let i of "abc"){ console.log(i); } // a // b // c 2 includes 是否包含某 ...

  8. Java岗 面试考点精讲(基础篇01期)

    即将到来金三银四人才招聘的高峰期,渴望跳槽的朋友肯定跟我一样四处找以往的面试题,但又感觉找的又不完整,在这里我将把我所见到的题目做一总结,并尽力将答案术语化.标准化.预祝大家面试顺利. 术语会让你的面 ...

  9. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

随机推荐

  1. 什么是EF, 和 Entity Framework Demo简单构建一个良好的发展环境

     Entity Framwork(实体框架.缩写EF)这是ORM(Object Relational Mapping.对象映射关系)一个解决方案. EF的表映射为实体.并封装了操作方法.方便开发者 ...

  2. JAVA基本的编程50称号(7-9称号)详细解释

    一个.叙述性说明 1.输入一行字符.在这些信件统计.空格.出现频率的数字和其他字符的总数和每一个字符.         程序分析:使用String类的matchs()分别统计符合正則表達式的每类字符的 ...

  3. [Unity-7] Update和FixedUpdate

    1.Update和FixedUpdate这是Unity既用内提供的帧功能接口相关联. Update():这个函数里面的内容每一帧都会被运行一次.这个函数有一个特点,那就是运行的频率等于帧率.而这个帧率 ...

  4. u-boot学习(两):u-boot简要分析

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 看到不错的文章.不要加入收藏夹, ...

  5. linux通过建模工具Umbrello

    https://umbrello.kde.org/ Umbrello UML Modeller is a Unified Modelling Language (UML) diagram progra ...

  6. Unity3d在线游戏Socket通讯

    网络游戏是一个人的互动娱乐软件应用.因为它是交互式,当然,需要了解对方的通信.这需要通信Socket:我们今天要实现的主角即套接字.Socket的英文原义是"孔"或"插座 ...

  7. C# 语言的两个html解析器

    基于C# 语言的两个html解析器   基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...

  8. hadoop编程技巧(3)---定义自己的区划类别Partitioner

    Hadoop代码测试环境:Hadoop2.4 原则:在Hadoop的MapReduce过程.Mapper阅读过程完成后数据.它将数据发送到Partitioner.由Partitioner每个记录应当采 ...

  9. centos6.4搭建apache+mysql+php环境

    最近用php做的项目到了项目部署的时候,服务器为centos6.4系统,为了快捷部署,采用yum安装部署 大部分内容参考博客  http://blog.sina.com.cn/s/blog_c02ed ...

  10. C# 语言的多线程编程,完全是本科OS里的知识

    基本知识,无参数Thread和带参数的Thread Thread类的参数就是参数指针,可以传入一个无参的函数. 如果要传入带参数的函数,先new一个ParameterizedThreadStart委托 ...