一、前言

C++的关键字static分两种用法,在面向过程程序设计(c语言中的普通变量和函数)中的使用和在面向对象程序设计(c++中的类)中的使用

二、面向过程程序设计中的static(静态变量、静态函数)

内存分布 特性
代码区 存放代码
全局数据区 全局静态变量和局部静态变量
一般程序的由new产生的动态数据
函数内部的自动变量。随着函数退出而释放

静态全局变量

静态全局变量特点

  1. 该变量在全局数据区分配内存
  2. 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化)
  3. 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的,即不可以被其他文件引用
  4. 其它文件中可以定义相同名字的变量,不会发生冲突(若为全局非静态变量则会发生冲突)
#include<iostream>
using namespace std; static int n; //定义静态全局变量 void func()
{
n++;
cout<<n<<endl;
} int main(void)
{
n = 20;
cout<<n<<endl;
func();
return 0;
}

静态局部变量

静态局部变量的特点

  1. 该变量在全局数据区分配内存
  2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化
  3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0
  4. 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
#include<iostream>
using namespace std; void fn(); int main(void)
{
fn();
fn();
fn();
return 0;
} void fn()
{
static int n = 10;
cout<<n<<endl;
n++;
}

静态函数

静态函数特点

  1. 静态函数不能被其它文件所用
  2. 其它文件中可以定义相同名字的函数,不会发生冲突
#include<iostream>
using namespace std; static void fn(); //声明静态函数 int main(void)
{
fn();
return 0;
} void fn() //定义静态函数
{
int n = 10;
cout<<n<<endl;
}

二、面向对象程序设计中的static(静态数据成员(类)、静态成员函数)

静态成员数据

静态成员数据特点

  • 作为类的成员,无论有多少对象,都只有一份拷贝,节省空间。该类所有对象都可以访问,在没有产生类的实例时就可以使用。
  • 储存在全局数据区,在定义时才分配空间,不能在类声明中定义(在类外定义),定义(初始化)的格式:<数据类型><类名>::<静态数据成员名>=<值>
  • 访问类的静态数据成员 两种格式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>(后一种需要静态数据成员为public成员)
  • 用于各个对象都有相同属性,例如存款类,每个实例的利息相同,则可以将利息设为静态数据成员。

与全局变量相比,静态数据成员:

  • 不会与全局命名空间中的其他相同名字冲突
  • 实现信息隐藏。可以为private。
#include<iostream>
using namespace std; class Myclass
{
private:
int a , b , c;
static int sum; //声明静态数据成员
public:
Myclass(int a , int b , int c);
void GetSum();
}; int Myclass::sum = 0; //定义并初始化静态数据成员 Myclass::Myclass(int a , int b , int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}
void Myclass::GetSum()
{
cout<<"sum="<<sum<<endl;
} int main(void)
{
Myclass M(1 , 2 , 3);
M.GetSum();
Myclass N(4 , 5 , 6);
N.GetSum();
M.GetSum();
return 0;
}

静态成员函数

静态成员函数特点

  • 静态成员函数可以访问静态数据成员和静态成员函数,即静态成员之间可以互相访问
  • 静态成员函数不可以访问非静态成员函数和非静态数据成员
  • 非静态成员函数既可访问非静态数据成员又可以访问静态数据成员和静态成员函数
  • 调用类的静态成员函数: <类名>::<静态成员函数名>(<参数表>)
  • 调用对象的静态成员函数: <类对象名>.<静态成员函数名>(<参数表>)
  • 是类的内部实现,属于类定义的一部分。不属于某个类对象,而属于类所有对象。
  • 普通成员函数隐含了this指针(缺省),它指向类对象本身,如函数func()实际为this->func()。
  • 静态成员函数不含this指针,因为不与任何对象相关。无法访问类对象的非静态数据成员和非静态成员函数,只能调用静态成员函数。
  • 与全局函数相比,静态成员函数访问速度更快,因为没有this指针的额外开销
#include<iostream>
using namespace std; class Myclass
{
private:
int a , b , c;
static int sum; //声明静态数据成员
public:
Myclass(int a , int b , int c);
static void GetSum(); //声明静态成员函数
}; int Myclass::sum = 0; //定义并初始化静态数据成员 Myclass::Myclass(int a , int b , int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
//cout<<a<<endl; //错误代码,a是非静态数据成员
cout<<"sum="<<sum<<endl;
} int main(void)
{
Myclass M(1 , 2 , 3);
M.GetSum();
Myclass N(4 , 5 , 6);
N.GetSum();
Myclass::GetSum();
return 0;
}

【c++小知识】static用法浅析的更多相关文章

  1. Unicode和汉字编码小知识

    Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...

  2. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  3. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

  4. C++中extern “C”含义及extern、static关键字浅析

    https://blog.csdn.net/bzhxuexi/article/details/31782445 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C ...

  5. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  6. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  7. 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  8. 【C#小知识】C#中一些易混淆概念总结(五)---------深入解析C#继承

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  9. 【C#小知识】C#中一些易混淆概念总结(四)---------解析Console.WriteLine() 分类: C# 2014-02-05 17:18 1060人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) [C#小知识]C#中一些易混淆概念总结(三) ------------------------------ ...

随机推荐

  1. Java学习_异常处理

    Java的异常 计算机程序运行的过程中,总是会出现各种各样的错误.有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc.程序想要读写某个文件的内容,但是用户已经把它删 ...

  2. BP暴力破解

    BurpSuite暴力破解 1.设置代理 首先要用phpstudy打开Mysql和Apache,然后将设置浏览器代理,地址127.0.0.1  端口8080 2.进入dvwa靶场 进入dvwa时,要用 ...

  3. 发起一个开源项目:基于 .NET 的博客引擎 fluss

    今天我们发起一个开源项目,它的名字叫 fluss,fluss 是 river 的德语. 百川归海,每一个博客就如一条河流,输入的是文字,流出的是知识,汇入的是知识的汪洋大海. 川流不息,fluss 是 ...

  4. 解决npm ERR!

    一:[Unexpected end of JSON input while parsing near]报错 最近的vue项目中在执行 npm install 时会报错误: npm ERR! Unexp ...

  5. Daphile 安装手册 -- 官方文档译文 [原创]

    Daphile 安装手册(Daphile Installation) 英文原文:https://www.daphile.com/download/DaphileInstallation.pdf 采集日 ...

  6. Turtlebot3入门教程-系统-SBC软件设置(ubuntu20.04)

    本文针对如何在树莓派3上安装ubuntu20.04系统和软件进行讲解 树莓派3接上显示屏和鼠标后,开机后继续安装软件包 详细步骤如下: (1)系统安装 (2)ROS安装 (3)TurboBot3依赖的 ...

  7. 【linux】系统编程-5-线程

    目录 前言 7. 线程 7.1 概念 7.2 创建线程 7.2.1 pthread_create() 7.3 设置线程属性 7.3.1 pthread_attr_init() 7.3.2 销毁一个线程 ...

  8. [ABP教程]第三章 创建、更新和删除图书

    Web应用程序开发教程 - 第三章: 创建,更新和删除图书 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以 ...

  9. int和Integer的区别?包装类?装箱?拆箱?

    int和Integer的区别: 1) int是基本数据类型,直接存储的数值,默认是0; 2) Integer 是int的包装类,是个对象,存放的是对象的引用,必须实例化之后才能使用,默认是null; ...

  10. 2019 Java开发利器Intellij IDEA安装、配置和使用

    进入Intellij IDEA的官网,选择电脑对应的合适版本进行下载,这儿我选择的是Intellij IDEA的社区版,安装旗舰版可去网上找相应的教程. Intellij IDEA的官网:https: ...