zoukankan      html  css  js  c++  java
  • C++@类的静态成员变量和静态成员函数

    参考:

    http://blog.csdn.net/morewindows/article/details/6721430

    http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html

    分析Qt程序时,碰到下面代码。

     QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );
      静态成员变量 静态成员函数
    概念定义

    被所有的类的对象所共享的变量。

    即此变量是属于这个类的,它只被存储一份供所有的对象使用。

    不访问对象的任何数据,但是又是对象的成员函数,则声明为静态成员函数。
    形式体现 在类中定义静态成员变量时,前面加static 在类中定义静态成员函数时,最前面加static
    调用方法 <类名>::<静态成员名>

    <类名>::<静态成员名>(较为常见)

    <类对象名>.<静态成员函数>(较少用)

    语法规则

    类域中的全局变量,其定义不能放在头文件中,以防重复定义。

    被所有类的对象所共享,包括派生类的对象。

    类的静态成员变量必须先初始化然后使用。

    静态成员函数可以使用<类名>::<静态成员名>方式调用,但是普通成员函数不可以这样调用。

    不能在类的静态成员函数中使用非静态成员,因为静态成员函数不含this指针。

    但是可以在类的非静态成员函数中使用静态成员。

    静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。

    静态成员函数不可以同时声明为 virtual、const、volatile函数。

    静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。

    静态成员可以成为成员函数的可选参数,而普通数据成员不可以。

    静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

     

    class Point  
    {  
    public:   
        void init()  
        {    
        }  
        static void output()  
        {  
        }  
    };  
    void main()  
    {  
        Point::init();  
        Point::output();  
    }  
    //编译出错:error C2352: 'Point::init' : illegal call of non-static member function
    
    //上述main()可以改为
    void main()  
    {  
        Point pt;  
        pt.init();  
        pt.output();  
    }  
    //编译通过
    

      

    #include <stdio.h>  
    class Point  
    {  
    public:   
        void init()  
        {    
        }  
        static void output()  
        {  
            printf("%d
    ", m_x);  
        }  
    private:  
        int m_x;  
    };  
    void main()  
    {  
        Point pt;  
        pt.output();  
    }  
    //编译出错:error C2597: illegal reference to data member 'Point::m_x' in a static member function
    

      

    class Point  
    {  
    public:   
        void init()  
        {    
            output();  
        }  
        static void output()  
        {  
        }  
    };  
    void main()  
    {  
        Point pt;  
        pt.output();  
    }  
    //编译通过
    

      

    #include <stdio.h>  
    class Point  
    {  
    public:   
        Point()  
        {    
            m_nPointCount++;  
        }  
        ~Point()  
        {  
            m_nPointCount--;  
        }  
        static void output()  
        {  
            printf("%d
    ", m_nPointCount);  
        }  
    private:  
        static int m_nPointCount;  
    };  
    void main()  
    {  
        Point pt;  
        pt.output();  
    }  
    //编译通过,运行错误。改正:在main()函数前加上int Point::m_nPointCount = 0;
    

      

    class base{ 
    public : 
    static int _num;//声明 
    }; 
    int base::_num=0;//静态数据成员的真正定义 
    
    class derived:public base{ 
    }; 
    
    main() 
    { 
    base a; 
    derived b; 
    a._num++; 
    cout<<"base class static data number _num is"<<a._num<<endl; 
    b._num++; 
    cout<<"derived class static data number _num is"<<b._num<<endl; 
    } 
    // 结果为1,2;可见派生类与基类共用一个静态数据成员。 
    
    class base{ 
    public : 
    static base _object1;//正确,静态数据成员 
    base _object2;//错误 
    base *pObject;//正确,指针 
    base &mObject;//正确,引用 
    }; 
    
    class base{ 
    static int func1(); 
    int func2(); 
    }; 
    int (*pf1)()=&base::func1;//普通的函数指针 
    int (base::*pf2)()=&base::func2;//成员函数指针 
    
    class base{ 
    virtual static void func1();//错误 
    static void func2() const;//错误 
    static void func3() volatile;//错误 
    }; 
    

      

      

  • 相关阅读:
    按行打印二叉树结点值
    Kafka消息队列(继续深挖)
    【Java IO模式】Java BIO NIO AIO总结
    JAVA线程池的执行过程
    CentOS7升级版本
    【转】KVM中打开virt-manager报错或者将其显示为中文界面的办法
    【转】linux kvm虚拟机配置及常见问题处理
    【转】关于Quartus ii无法识别Modelsim路径的问题
    【转】[git]error: pack-objects died of signal
    storm kafka整合
  • 原文地址:https://www.cnblogs.com/kwseeker-bolgs/p/4649670.html
Copyright © 2011-2022 走看看