靜態成員函數是類的成員函數,該函數不屬於該類申請的任何一個對象,而是所有該類成員共同共有的一個函數。
舉個例子給你,你們班裡面有10個人(10個比如高一一班的對象),體育老師分給你們一個籃球(靜態成員函數),
你們每個人都帶了一個籃球(非靜態成員函數),你們都很小氣,自己的球只能自己拍,要是5對5打比賽,
那就只能用那個靜態籃球了(每個人都可以拿來用,但是帶來的影響是對全體的)。因此,我可以說那個籃球是
高一一班的成員。所以也就是說:靜態成員函數是類的成員函數(因為高一二班就不能拿來玩),但是這個籃球最
後還是要還給老師的,任何私人不得佔有。希望這樣你能明白,其實在機器結構裡面說白了靜態成員的記憶體是唯
一的一份,就是當你在類外聲明他時開闢的,但是非靜態函數的空間分配是在你執行個體化對象時建立的。希望你能明
白,第一次在百度知道裡面回答,以前都是來查。。。。
和待用資料成員一樣,靜態成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態成員函數,要用類名和域運算子“∷”。如
Box∷volume( );
實際上也允許通過對象名調用靜態成員函數,如
a.volume( );
但這並不意味著此函數是屬於對象a的,而只是用a的類型而已。
靜態成員函數的作用是為了能處理待用資料成員。
可以說,靜態成員函數與非靜態成員函數的根本區別是: 非靜態成員函數有this指標,靜態成員函數並不屬於某一對象,它與任何對象都無關,靜態成員函數沒有this指標。由此決定了靜態成員函數不能訪問本類中的非靜態成員。
在C++程式中,靜態成員函數主要用來訪問待用資料成員,而不訪問非靜態成員。假如在一個靜態成員函數中有以下語句:
cout<<height<<endl; //若height已聲明為static,則引用本類中的靜態成員,合法
cout<<width<<endl; //若width是非待用資料成員,不合法
但是,並不是絕對不能引用本類中的非靜態成員,只是不能進行預設訪問,因為無法知道應該去找哪個對象。如果一定要引用本類的非靜態成員,應該加對象名和成員運算子“.”。如
cout<<a.width<<endl; //引用本類對象a中的非靜態成員
假設a已定義為Box類對象,且在當前範圍內有效,則此語句合法。
舉例:
#include <iostream>
using namespace std;
class Student //定義Student類
{public:
Student(int n,int a,float s):num(n),age(a),score(s){ } //定義建構函式
void total( );
static float average( ); //聲明靜態成員函數
private:
int num;
int age;
float score;
static float sum; //待用資料成員
static int count; //待用資料成員
};
void Student∷total( ) //定義非靜態成員函數
{sum+=score; //累加總分
count++; //累計已統計的人數
}
float Student∷average( ) //定義靜態成員函數
{return(sum/count);
}
float Student∷sum=0; //對待用資料成員初始化
int Student∷count=0; //對待用資料成員初始化
int main( )
{Student stud[3]={ //定義對象數組並初始化
Student(1001,18,70),
Student(1002,19,78),
Student(1005,20,98)
};
int n;
cout<<〃please input the number of students:〃;
cin>>n; //輸入需要求前面多少名學生的平均成績
for(int i=0;i<n;i++) //調用3次total函數
stud[i].total( );
cout<<〃the average score of 〃<<n<<〃 students is 〃<<Student∷average( )<<endl;
//調用靜態成員函數
return 0;
}
運行結果為
please input the number of students:3
the average score of 3 students is 82.3333
說明:
(1) 在主函數中定義了stud對象數組,為了使程式簡練,只定義它含3個元素,分別存放3個學生的資料。程式的作用是先求使用者指定的n名學生的總分,然後求平均成績(n由使用者輸入)。
(2) 在Student類中定義了兩個待用資料成員sum(總分)和count(累計需要統計的學生人數),這是由於這兩個資料成員的值是需要進行累加的,它們並不是只屬於某一個對象元素,而是由各對象元素共用的,可以看出: 它們的值是在不斷變化的,而且無論對哪個對象元素而言,都是相同的,而且始終不釋放記憶體空間。
(3) total是公有的成員函數,其作用是將一個學生的成績累加到sum中。公有的成員函數可以引用本對象中的一般資料成員(非待用資料成員),也可以引用類中的待用資料成員。score是非待用資料成員,sum和count是待用資料成員。
(4) average是靜態成員函數,它可以直接引用私人的待用資料成員(不必加類名或對象名),函數返回成績的平均值。
(5) 在main函數中,引用total函數要加對象名(今用對象數組元素名),引用靜態成員函數average函數要用類名或對象名。