靜態成員變量與靜態成員函數


一、靜態成員變量

類的靜態成員變量是直接與類聯系,屬於類的成員而不是對象,供所有對象共享,存放於全局區,因而不計入類的內存計算。

靜態成員變量可以通過類直接訪問。

(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;//常量靜態成員可以在類內初始化
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM