【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. 欧几里德欧几里德原理和扩展的原则,(Euclidean Theory and Extended Euclidean Theory)学习笔记

    题记:这是我第四次审查扩展欧几里德原理,由于不经常使用.当你想使用,可以不记得细节,经常检查信息,所以,简单地梳理这一原则和扩展欧几里德的原则,以博客存档以备查用. 一个.欧几里德原理 欧几里德原理( ...

  2. 用bat启动sqlserver服务

    声明下这个脚本不是我写的,忘了是从哪看到的了,在此分享给大家,因为在我的理解中技术就是用来分享的,,希望原创作者看到了不要介意. 1.创建个文本,将后缀名改成.bat 2.将下边语句粘贴进去,然后保存 ...

  3. .NET开源项目 TOP 25

    .NET开源项目 TOP 25 如果知道.NET项目在开源中国的git上所占的比重只有5%的话,为什么这个<2014年国人开发的最热门的开源软件TOP 100>榜中.NET项目那么少就是情 ...

  4. Java-DES算法加密解密工具类

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import ...

  5. Python什么是值或引用函数参数

    这篇文章是Python前往遇到有疑问的功能. 下面一段是原有的基础教程Python函数. 按值传递參数和按引用传递參数 全部參数(自变量)在Python里都是按引用传递.假设你在函数里改动了參数,那么 ...

  6. 在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样?

    原文:在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样? <a href="javascript:alert(this.innerHTML ...

  7. June本地环境搭建

    python-china.org论坛使用的June程序就是这货了,使用了Python Flask + SQLite + Node.js 的轻论坛,以后就打算拿这个学习了,如果可能,进行二次开发. Gi ...

  8. php中的$_GET怎样获取带有井号“#”的參数

    <?php echo $_GET['key']; ?> 当url为http://test.com/c.php?key=999时,正常输出:999 当url为http://test.com/ ...

  9. Windows上memcached的使用

    Memcached是什么?Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached能缓存什 ...

  10. DropDownList和GridView用法

    DropDownList和GridView用法   DropDownList控件和GridView控件在Asp.net中相当常用,以下是控件的解释,有些是常用的,有些是偶尔的,查找.使用.记录,仅此而 ...