靜態成員 static 能被繼承嗎


在類定義中,它的成員(包括數據成員和 成員函數)可以用關鍵字static聲明為靜 態的,這些成員稱為靜態成員
靜態成員的特性:
• 不管這個類創建了多少個對象,靜態成員只有一個拷貝,這個拷貝被所有屬於這個類的
對象共享
靜態成員包括:
• 靜態數據成員
• 靜態成員函數
在一個類中,若將一個數據成員聲明為 static,這種成員稱為靜態數據成員。
(靜態數據成員在類內聲明,在類外定 義)
與一般的數據成員不同,無論建立了多 少個對象,都只有一個靜態數據的拷貝
可以認為該靜態數據是屬於該類的,而 不是具體的屬於某一個對象
 
說明:
• 靜態數據成員屬於類(准確地說,是屬於類中 一個對象集合),而不像普通數據成員那樣屬 於某一對象,
因此可以使用“類名::”訪問靜態 的數據成員。但也可以通過“對象名.”訪問
• 靜態數據成員不能在類中進行初始化,因為在 類中不給它分配內存空間,必須在類外的其它 地方為它提供定義。一般在main() 開始之前、類的聲明之后的特殊地帶為它提供定義 和初始化。缺省時,靜態成員初始為0
 
靜態成員函數可以在類內定義。也可以在類內聲明,類外定義。在類外定義時,不要用 static前綴
• 編譯系統將靜態成員函數限定為內部連接, 也就是說,與現行文件相連接的其它文件中 的同名函數不會與該函數發生沖突,維護了 該函數使用的安全性,這是使用靜態成員函 數的一個原因
• 使用靜態成員函數的另一個原因是,可以用 它在建立任何對象之前處理靜態數據成員, 這是普通成員函數不能實現的功能
 
在一般的成員函數中都隱含有一個this指 針,用來指向對象自身,而在靜態成員函數 中沒有this指針,因為它不與特定的對象相 聯系,調用時使用:
類名::靜態成員函數名() 如:SmallCat::totalDisp(),當然使用:
對象.靜態成員函數名() 也是正確的。如:w1.totalDisp()
• 一般而言,靜態成員函數不能訪問類中的非靜態成員
 
繼承
基類和其派生類共享該基類的靜態成員變量內存!
1.   父類的static變量和函數在派生類中依然可用,但是受訪問性控制(比如,父類的private域中的就不可訪問),而且對static變量來說,派生類和父類中的static變量是共用空間的,這點在利用static變量進行引用計數的時候要特別注意。   
2.   static函數沒有“虛函數”一說。因為static函數實際上是“加上了訪問控制的全局函數”,全局函數哪來的什么虛函數?   
3.   派生類的friend函數可以訪問派生類本身的一切變量,包括從父類繼承下來的protected域中的變量。但是對父類來說,他並不是friend的。
#include <iostream>
using namespace std;
class Base
{
public:
   static int a;
   static void Fun( )
   {
       cout<<"Base fun()!"<<endl;
   }
};
int Base::a=1000;
class Derived:public Base
{
public:
    static void Fun()
   {
       cout<<"Derived fun()!"<<endl;
   }
};
int main(void)
{
    cout<<Derived::a<<endl;
    Derived d;
    d.Fun();
    Base b = (Base) d;
    b.Fun();
    return 0;
}
1000
Derived fun()!
Base fun()!
 
測試代碼會發現Base、Derived類中的 a 值相等,然后查看地址發現地址也相等。所以父類子類指向是同一個全局數據區的static變量。如果定義 int Derived::a=200; 會出現編譯錯誤。
不能被繼承。
子類可以訪問父類的static變量,但受訪問控制(若父類中的static是private就無法訪問)
子類和父類的static變量是同一變量,共享同一存儲空間。
而繼承關系,子類和父類是分別有自己的存儲空間的。
 
#include<iostream>
using namespace std;  
int cnt=1;  
  
void f(){  
    static int test = cnt;  
    cout<<test<<endl;  
    cnt++;  
}  
  
int main(){  
    f();  
    f();  
    f();  
    cout<<cnt<<endl;  
    return 0;  
}
1
1
1
4
但是C++規定,局部static變量只會初始化一次!所以第一個程序中后面調用兩次f()都不會初始化test。
 


免責聲明!

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



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