zoukankan      html  css  js  c++  java
  • C89:论静态(static)

    一.简介

    Const修饰的类型跟它本身的内存值有关,而Static修饰的类型跟它内存生命周期有关

    只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格

    (1)对其他源文件隐藏

    (2)保持变量内存的持久,保持唯一性,只占一份内存

    (3)默认初始化为0

    注意:形参不能被static修饰

    • 规则:

    规则1:普通局部变量用完就释放,所以当我们需要多次用到同一份变量数据的时候,就可以用static来留住这个变量的数据

    二.用于C代码

    (1)修饰局部变量

    保持内存的持久(保持唯一性,只占一份内存)

    规则1:普通局部变量用完就释放,所以当我们需要多次用到同一份变量数据的时候,就可以用static来留住这个变量的数据

    void A(){
         
        //普通局部变量存储于进程栈空间,使用完毕后会立即释放
        //静态局部变量编译器会默认初始化为0,存储于进程的全局数据区,程序结束时释放
        static int a=1;
    }

    (2)修饰全局变量

    对其他源文件隐藏

    规则2:全局变量可能会导致多线程竞争同一份数据,用static可以把变量留住在单一源文件里面使用

    //全局变量本身就有内存的持久性,所以静态全局变量用于在其他源文件屏蔽该变量
      
    //全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化
    //普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用,也就是说其他文件不能定义一个同名的变量
    //静态全局变量仅对其当前文件可见,其他文件不可访问,其他文件可以拥有同名的变量
      
      
    //file1.cpp
    int varA;
    static int varB;
      
    //file2.cpp
    extern int varA;        //使用其他源文件的全局变量
    extern int varB;        //错误,静态全局变量被屏蔽

    (3)修饰全局函数

    对其他源文件隐藏

    规则3:

    //非静态函数可以在另一个文件中直接引用不必加extern声明
    //静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    //不同的文件可以使用相同名字的静态函数
      
    //file1.cpp
      
    extern void funA(){}
    static void funB(){}
      
    //file2.cpp
      
    extern void funA();    //使用其他源文件的全局变量
    extern void funB();    //错误,静态全局函数屏蔽了该函数

    三.用于C++代码

    非静态成员能够访问静态成员,因为生命周期还在.

    静态成员不能访问非静态成员

    (1)修饰类的静态成员变量

    默认初始化为0,保持内存的持久(保持唯一性,只占一份内存),不存在this指针

    //静态成员可以独立访问,无须创建任何对象实例就可以访问
    //静态成员变量每个class只有一份变量内存(全局数据区/静态区),而普通成员函数每个对象都有不同的变量内存
      
    //test.h
    class A{
        private:
            static const int a;
    }
      
    //test.cpp
    const int A::a=1;    //不受private和protected访问限制

    (2)修饰类的静态成员函数

    保持内存的持久(保持唯一性,只占一份内存)

    //类的静态成员函数无法调用类的非静态成员函数和变量,因为静态成员函数没有this指针
    //类的非静态成员函数可以调用类的静态成员函数和变量
    //静态成员函数不可以同时声明为virtual const volatile函数
      
    class A{
        public:
            virtual static void fun1();    //错误
            static void fun2() const;      //错误
            static void fun2() volatile;   //错误
    };
  • 相关阅读:
    php自动跳转中英文页面
    如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
    彻底杜绝warning: Cannot add header information headers already sent in......
    大三了
    X牛人關於編程語錄
    C++虚函数表解析
    epoll:Edge or Level Triggered
    LRU和LFU的区别
    会话、进程组与僵死进程
    Effective C++学习笔记:确定基类有虚析构函数
  • 原文地址:https://www.cnblogs.com/k5bg/p/11822165.html
Copyright © 2011-2022 走看看