• static


      之前没注意static这个关键词,被人问到的时候竟然不知道= =!果断补补

      1.全局变量与静态全局变量,全局变量可以在声明的情况下,在项目的各个文件通用,静态全局变量就只能在当前定义的文件下使用。

      1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
      2)全局静态变量是显式用static修饰的全局变量作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
    //Example 2
    //File1 第一个代码文件的代码
    #include <iostream>
    using namespace std;
    void fn();    //声明 fn 函数
    static int n; //定义静态全局变量
    void main(){    
        n=20;    
        cout<<n<<endl;    
        fn();
    }
    //File2 第二个代码文件的代码
    #include <iostream>
    using namespace std;
    extern int n;
    void fn(){    
        n++;    
        cout<<n<<endl;
    }

      2.静态局部变量与局部变量

      静态局部变量在全局数据区中,而局部变量在内存栈中,所以函数结束,局部变量被释放,而静态不被释放,依旧保留上一次的结果。

      

      3.全局函数与静态全局函数

      作用域的不同,跟全局变量与静态全局变量的作用局机制类似。

      4.非静态数据成员与静态数据成员

      对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;

      5.成员函数与静态成员函数

      与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部 实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

      优点:由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

      缺点:静态成员函数只能访问静态数据成员

    #include<stdio.h>
    #include <iostream>
    using namespace std;
    
    class Myclass{
    public: Myclass(int a,int b,int c);
            static void GetSum(); 
            // 声明静态成员函数
    private: int a,b,c;
             static int Sum;
             //声明静态数据成员
    };
    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;
    }
    
    class data{
        int a;
        inline ~data(){
        }
    };
    
    void main(){
        Myclass M(1,2,3);
        M.GetSum(); 
        Myclass::GetSum();
        Myclass N(4,5,6);
        N.GetSum();
        Myclass::GetSum();
    
        getchar();
    }

    参考:http://baike.baidu.com/link?url=37eC8nXdPrs4p6SJYvK52TfCTaQ5aIOWTioQ-HCeBrXWhLbDLR9W7srYtv1OKFdK

  • 相关阅读:
    请简单说一下你了解的端口及对应的服务?
    地址解析协议ARP和逆地址解析协议RARP
    IP地址分类
    OSI分层和五层协议
    对象如何晋升到老年代?
    JVM 垃圾回收机制,何时触发 MinorGC 等操作
    什么是引用?
    类加载机制
    Solaris10怎么创建flash archive
    RPC: program not registered (ZT)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3495496.html
Copyright © 2020-2023  润新知