C++ 中的靜態成員函數與靜態成員變量


於CSDN 2014-01-17

 

與靜態數據成員一樣,靜態成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態成員函數,要用類名和域運算符"∷"。如Box∷volume( );實際上也允許通過對象名調用靜態成員函數,如a.volume( );但這並不意味着此函數是屬於對象a的,而只是用class 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函數要用類名或對象名。

 

 


免責聲明!

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



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