您的位置:首页 > 编程语言 > C语言/C++

C++的静态成员变量和静态成员函数详解

2015-08-04 10:26 239 查看
1、静态成员变量在使用前必须初始化,且初始化必须是在类外。

[code]#include <iostream>
using namespace std;
class CStudent
{
private:
    static int m_nsCount;

public:
    /* 构造函数 */
    CStudent()
    {
        m_nsCount++;
    }
    static void displayCount()
    {
        cout << "m_nCount = " << m_nsCount << endl;
    }
};

int CStudent::m_nsCount = 0;

int main()
{
    CStudent stu1;
    stu1.displayCount();
}


2、静态成员函数不能调用类的非静态成员变量:

因为静态成员函数和静态成员变量在类的实例化之前就已经分配了一块内存,已经被初始化了。而非静态成员变量在类的实例化的时候才被初始化。

如果静态成员函数调用非静态成员变量就相当于,调用了一个没有定义的变量,导致错误。

[code]#include <iostream>
using namespace std;

class CStudent
{
private:
    static int m_nsCount; //静态成员变量
    int m_nData;  //非静态成员变量
public:
    /* 构造函数 */
    CStudent()
    {
        m_nData = 0;
        m_nsCount++;
    }
    static void displayCount()
    {
        cout << "m_nsCount = " << m_nsCount << endl;
        cout << "m_nCount = " << m_nData << endl; //错误
    }
};

int CStudent::m_nsCount = 0;//一定要在类外初始化

int main()
{
    CStudent stu1;
    stu1.displayCount();
}


3、非静态成员函数可以调用静态成员变量

[code]#include <iostream>
using namespace std;

class CStudent
{
private:
    static int m_nsCount; //静态成员变量
    int m_nData;  //非静态成员变量
public:
    /* 构造函数 */
    CStudent()
    {
        m_nData = 0;
        m_nsCount++;
    }
    /* 非静态成员函数调用静态成员变量 */
    void addCount()
    {
        m_nsCount++; //正确
    }
};

int CStudent::m_nsCount = 0;//一定要在类外初始化

int main()
{
    CStudent stu1;
    stu1.addCount();
}


4、通过类名不可以调用类的非静态成员函数。

[code]#include <iostream>
using namespace std;

class CStudent
{
private:
    static int m_nsCount; //静态成员变量
    int m_nData;  //非静态成员变量
public:
    /* 构造函数 */
    CStudent()
    {
        m_nData = 0;
        m_nsCount++;
    }
    static void displayCount()
    {
        cout << "m_nsCount = " << m_nsCount << endl;
    }

    void addCount()
    {
        m_nsCount++; //正确
    }
};

int CStudent::m_nsCount = 0;//一定要在类外初始化

int main()
{
   CStudent::addCount();//,错误类名不可以调用非静态成员函数
   CStudent::displayCount();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: