美文网首页
c++ Static详解

c++ Static详解

作者: yz_wang | 来源:发表于2018-07-23 11:35 被阅读0次
面向过程

静态全局变量


#include<stdio.h> 
static int Temp = 10;
void Test();
int main()
{
    printf("Temp is %d\n", Temp);//输出:10
    Test();//输出:10
    printf("Temp is %d\n", Temp);//输出:11
    return 0;
}
void Test()
{
    Temp++;
}
  • 静态全局变量在声明它的整个文件中都是可见而在文件之外是不可见的,这点区别于全局变量,全局变量的作用域在整个工程。
  • 静态全局变量在全局数据区分配内存。

静态局部变量

#include <stdio.h>
void Test();
int main()
{
    for(int i=0; i<5; i++)
    {
        Test();
    }
    return 0;
}

void Test()
{
    static Temp = 10;
    printf("Temp is %d\n", Temp);
    Temp++;
} //输出:10,11,12,13,14

  • 局部变量被声明为static 静态局部变量时,则该变量的生命周期不受到该函数的作用域限制,也就是说即使函数运行结束,系统仍然会保留该静态变量的内存,不会回收,它始终驻留在全局数据区当中,直到整个进程程序运行结束时,其内存才会被回收.
  • .静态局部变量在程序执行到该对象声明时,会被首次初始化.其后运行到该对象的声明时,不会再次初始化,这也是为什么上面程序测试函数每次输出的值都是递增的原因.
  • 局部静态变量 不能被其作用域之外的其他模块调用,其调用范围仅限于声明该变量的函数作用域当中.

静态函数

#include<stdio.h>
static void Test();
int main()
{
    Test();
    return 0;
}
void Test()
{
    printf("Is Static Fun\n");
}
  • 静态函数与普通函数不同,其作用域只在声明它的文件当中.其他文件可以定义同名的全局函数,而不冲突.
  • 想要在其他文件调用静态函数 需要显示的调用extern关键字修饰其声明.否则编译器会link error.




面向对象

静态数据成员

#include <stdio.h>
class TempClass
{
public:
    TempClass(int a, int b, int c);
    void Show();
private:
    int a,b,c;
    static int T;
}
int TempClass::T = 0;//初始化静态数据成员
TempClass::TempClass(int a, int b, int c)
{
    this->a = a;
    this->b = b;
    this->c = c;
    T = a + b + c;
}

void TempClass::Show()
{
    printf("T is %d\n", T);
}

int main()
{
    TempClass ClassA(1,1,1);
    ClassA.Show();//输出1+1+1 = 3;
    TempClass ClassB(3,3,3);
    ClassB.Show();//输出3+3+3 = 9;
    ClassA.Show();//输出9
    return 0;
}
  • .静态数据成员的服务对象并非是单个类实例化的对象,而是所有类实例化的对象(这点可以用于设计模式中的单例模式实现).
  • .静态数据成员与其他成员一样,遵从public,protected,private的访问规则.
  • 静态数据成员内存存储在全局数据区,只随着进程的消亡而消亡.

静态成员函数


#include <stdio.h>
class TempClass
{
public:
    TempClass(int a, int b, int c);
    static void Show();
private:
    int a,b,c;
    static int T;
}
int TempClass::T = 0;   //初始化静态数据成员
TempClass::TempClass(int a, int b, int c)
{
    this->a = a;
    this->b = b;
    this->c = c;
    T = a + b + c;
}
void TempClass::Show()
{
    printf("T is %d\n", T);
}
int main()
{
    TempClass ClassA(1,1,1);
    ClassA.Show();
    TempClass ClassB(3,3,3);
    ClassB.Show();
    
    TempClass::Show();  //注意此处的调用方式.
    return 0;
}
  • 静态成员函数比普通成员函数多了一种调用方式.
  • .静态成员函数为整个类服务,而不是具体的一个类的实例服务.(这句话可能比较绕口,可以理解为在没有任何实例化的类对象的条件下调用类方法,详见上面代码注释处.)
  • 静态成员函数中没有隐含的this指针,所以静态成员函数不可以操作类中的非静态成员.

相关文章

  • c++ Static详解

    ref:https://blog.csdn.net/u010797208/article/details/4154...

  • C++面试题整理

    C++基础部分 C++ static_cast和dynamic_cast的区别 static_cast可以部分的做...

  • C++中static数据成员详解

    本文和大家分享的主要是c++中static数据成员的相关用法及源码示例,希望能帮助大家更好的学习C++。 stat...

  • 【C++】static 变量详解-变量篇

    static修饰变量的话,有两点要注意。 1.变量的存储区域在全局区,不管变量是在函数体内,class内,还是cp...

  • C++面向对象编程(下)第二周笔记 GeekBand

    1.对象模型 C++对象模型中,non static数据成员被放置到对象内部,static数据成员,static ...

  • C++学习笔记目录

    C++初步 C++数据长度 C/C++ 堆 栈 静态 常量 代码 区 static关键字 C++类和对象 C++引...

  • C++语言-this关键字、友元函数友元类、操作符重载

    1、C++中的可变参数 2、C++ static关键字 static关键小结:1、绝大多数和Java一样,静态的函...

  • static关键字

    一直使用static,但没用总结过,时间一长概念总有点模糊,趁着这次机会总结一下。c++中:C++中static有...

  • c++ static

    static函数只能访问static变量static变量不参与继承 static变量在main初始化之前完成赋值

  • C++ STATIC

    静态数据成员 静态成员可实现多个对象间的数据共享,不会破坏隐藏的原则静态成员是类的所有对象共享的成员,而不是某个对...

网友评论

      本文标题:c++ Static详解

      本文链接:https://www.haomeiwen.com/subject/wuvdmftx.html