zoukankan      html  css  js  c++  java
  • 静态成员

    我们可以使用static关键字把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。

    静态成员在类的所有对象都是贡献的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为0。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。

    静态成员变量

    /***
    static.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class Box
    {
        public:
            static int objectCount;
            Box(double l = 2.0,double b = 2.0,double h = 2.0)
            {
                cout << "Construct called." << endl;
                length = l;
                breadth = b;
                height = h;
                objectCount++;
            }
            double Volume()
            {
                return length*breadth*height;
            }
        private:
            double length;
            double breadth;
            double height;
    };
    
    int Box::objectCount = 0;
    
    int main()
    {
        Box box1(3.3,1.2,1.5);
        Box box2(8.5,6.0,2.0);
        cout << "Total object: " << Box::objectCount << endl; 
        return 0;
    
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190807$ g++ static.cpp -o static

    exbot@ubuntu:~/wangqinghe/C++/20190807$ ./static

    Construct called.

    Construct called.

    Total object: 2

    静态成员函数:

    如果把函数成员声明为静态的,就可以把函数和类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也可以被调用,静态函数只要使用类名加范围解析运算符::就可以访问。

    静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。

    静态成员函数有一个类范围,他们不能访问类的this指针。也可以使用静态成员函数来判断类的某些对象是否被创建。

    静态成员函数和普通成员函数的区别:

    静态成员函数没有this指针,只能访问静态成员(包括静态成员变量和静态成员函数)

    普通成员函数有this指针,可以访问类中的任意成员;而静态成员函数没有this指针。

     

    /***
    staticfun.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class Box
    {
        public:
            static int objectCount;
            Box(double l = 2.0,double b = 2.0,double h = 2.0)
            {
                cout << "Construct called." << endl;
                length = l;
                breadth = b;
                height = h;
                objectCount++;
            }
            double Volume()
            {
                return length*breadth*height;
            }
            static int getCount()
            {
                return objectCount;
            }
        private:
            double length;
            double breadth;
            double height;
    };
    
    int Box::objectCount = 0;
    
    int main()
    {
        cout << "Init stage count: " << Box::getCount() << endl;
        Box box1(3.3,1.2,1.5);
        Box box2(8.5,6.0,2.0);
        cout << "final stage count: " << Box::getCount() << endl; 
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190807$ g++ staticfun.cpp -o staticfun

    exbot@ubuntu:~/wangqinghe/C++/20190807$ ./staticfun

    Init stage count: 0

    Construct called.

    Construct called.

    final stage count: 2

    静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面

    定义,实际上是给静态成员变量分配内存,如果不加定义就会报错,初始化是赋一个初始值,而定义是分配内存。

    利用静态成员变量来了解构造和析构函数的调用情况。

    #include<iostream>
    using namespace std;
    
    class Cpoint
    {
        public:
            static int value;
            static int num;
            
            Cpoint(int x,int y)
            {
                xp = x;
                yp = y;
                value++;
                cout << "call construct " << value << endl;
            }
            ~Cpoint()
            {
                num++;
                cout << "call deconstruct " << num << endl;
            }
        private:
            int xp;
            int yp;
    };
    
    int Cpoint::value = 0;
    int Cpoint::num = 0;
    
    class CRect
    {
        public:
            CRect(int x1,int x2):mpt1(x1,x2),mpt2(x1,x2)
            {   
                cout << "call construct" << endl; 
            }
            ~CRect()
            {
                cout << "call deconstruct" << endl;
            }
        private:
            Cpoint mpt1,mpt2;
    };
    
    int main()
    {
        CRect p(10,20);
        cout << "hello world!" << endl;
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190807$ g++ construct.cpp -o construct -g

    exbot@ubuntu:~/wangqinghe/C++/20190807$ ./construct

    call construct 1

    call construct 2

    call construct

    hello world!

    call deconstruct

    call deconstruct 1

    call deconstruct 2

    类中特殊成员变量的初始化问题:

    1. 常量变量:必须通过构造函数参数列表进行初始化
    2. 引用变量:必须通过构造函数参数列表进行初始化
    3. 普通静态变量:要在类外通过“::”初始化
    4. 静态整型变量:可以直接在定义的时候初始化
    5. 静态非整型常量:不能直接在定义的时候初始化。要在类通过”::”初始化
  • 相关阅读:
    MyEclipse配置DataBase Explorer
    Eclipse 如何设置注释的模板
    游戏开发技术
    static_cast 与reinterpret_cast
    一个人的成功取决于晚上的8点至10点经典语录必读
    发送消息给线程
    转载ofstream和ifstream详细用法
    Effective STL笔记
    Making your C++ code robust
    TGA文件
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11316626.html
Copyright © 2011-2022 走看看