一、靜態成員變量
類的靜態成員變量是直接與類聯系,屬於類的成員而不是對象,供所有對象共享,存放於全局區,因而不計入類的內存計算。
靜態成員變量可以通過類直接訪問。
(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;//常量靜態成員可以在類內初始化 };