zoukankan      html  css  js  c++  java
  • 静态成员变量与静态成员函数

    一、静态成员变量

    类的静态成员变量是直接与类联系,属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。

    静态成员变量可以通过类直接访问。

    (1)静态成员变量的初始化

    静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。

    关键字static只出现类的内部。

    1、在类外定义且初始化

    2、常量静态成员可以在类内初始化

    一般来说无论怎样静态成员变量都需要在类外进行定义(定义可以初始化赋值,如果不显示初始化就是默认初始化)

    (2))静态成员变量的访问

    1、使用类作用域运算符直接访问

    2、使用类的对象访问

    3、成员函数可以直接访问

    #include <iostream>
    using namespace std;
    class A
    {
    public:
        A(){}
        int val();
        static int stval();
        static int ac;
        const static int bc=2;//常量静态成员可以在类内初始化
    private:
        static int dc;
        int nn;
    };
    int A::ac=1;    //类外定义且初始化
    int A::dc=1;
    int A::stval()
    {
    //    nn=10; 静态成员函数不能调用非静态成员
        dc=20;
        return dc;
    }
    int A::val()
    {
        dc=ac;
        return dc;
    }
    int main()
    {
        A a;
        cout<<a.ac;    //使用类的对象访问
        cout<<a.val();
        cout<<A::bc;  //类作用域运算符直接访问
        cout<<A::stval();
        cout<<a.stval();
        return 0;
    }

    (2)静态成员能使用的某些场景,普通成员不可以的

    1、静态成员可以是不完全类型

    2、静态成员可以作为默认实参

    3、作为类对象的共享成员

    class B
    {
    public:
        B(){}
    private:
        int val;
        static B num1;  //静态成员与指针都可以是非完整类型
        B* num2;
    //    B num3;  //普通成员变量必须是完整类型
    };
    
    class C
    {
    public:
        C(char c = bkg){}
    //    C(int v = yb){} 出错,普通成员变量不能作为默认实参
    private:
        char df;
        int yb;
        static int yy;
        static const char bkg='a';
    };
    int C::yy=1;
    int main()
    {
        B b;
        C c;
        return 0;
    }

    二、静态成员函数

    1、静态成员函数类似于静态成员变量都属于类而不是对象。

    2、静态成员函数仅可以调用类的静态成员变量,不可以调用普通成员变量。

    3、不具有this指针,因而自然不能声明为const。

    class A
    {
    public:
        A(){}
        int val();
     //   static int stval ()const; 出错,不具有this指针
    private:
        static int bc=2;//常量静态成员可以在类内初始化
    };
  • 相关阅读:
    忏悔书(IT攻城狮)
    【博文汇总】彩色图像分割 Menu
    【Android】Android 4.2源码下载(ubuntu 12.10)
    【My Project】织物疵点检测机器视觉系统 软件测试平台
    【NFC】Android NFC API Reference中英文
    【分享】RSS订阅技巧及工具和实用RSS链接分享
    【流媒體】live555—VS2010/VS2013 下live555编译、使用及测试
    vc++ win32项目属性介绍(二、c/c++)
    c风格回调函数 vs c++风格虚基类,关于接口定义和调用的对比
    关于移动技术的我的看法(二)
  • 原文地址:https://www.cnblogs.com/kiplove/p/6875371.html
Copyright © 2011-2022 走看看