1. 程式人生 > >static資料成員、成員函式的問題

static資料成員、成員函式的問題

錯誤提示:pure specifier can only be specified for functions

問題原因:不能在類裡邊賦static資料成員的初值

錯誤提示:'static' should not be used on member functions defined at file scope

問題原因:static 不能在檔案區域內定義!也就是說不能在類裡面定義,必須先在類裡面宣告然後在類外定義!

總結(轉載如下)

1.         靜態資料成員static data member 是 類的,而不是僅屬於某個物件的,該類的所有物件都可以呼叫它,類也可以呼叫。物件可呼叫它,但不是獨佔。生存期:編譯時就分配,程式結束才釋放空間。他只能在類體外初始化。作用域:與定義它的類的作用域相同,即與類同在。他的存在是為了物件間的共同交流。

2.         靜態成員函式Static member function 是為了呼叫static data member 而存在。Compile 不為他分配this 指標,所以他不能呼叫物件 的非static data member。當你非要呼叫 非Static data member 時,只要 指明物件就行了(因為沒有compile 沒有為類的static member function 指定 this 指標,所以引用 非靜態成員變數時分不清是哪個物件的,當你指明物件來呼叫不就行了。)

加了static 限制符的data member or member function 只是限制了呼叫的權利,並沒有限制 被呼叫的權利。非static 的物件和非static的member function 都可以呼叫他們。

#include <iostream>
using namespace std;

class Student
{
public :
Student(int n=3, int a=20,float s=100):num(n),age(a),score(s){};//define the constructervoid total();//這個建構函式可以代替 建構函式的過載(三個引數,兩個引數,一個引數都可以呼叫它。但0個引數不可以,以為 C++ 為了相容C 的語法,Student std() 是定義了一個返回Student 類的函式。可以用 Stduent std 來代替。即去掉括號)。
static float

average();// define static member function
private :// 變數儘量設定為 private ,用成員函式 intialize and get, set
int num;
int age;
float score;
static float sum;
static int count;

};// this semicolon must be added.
void Student::total()
{
sum+=score;// clculate the sun of secores// 普通函式可以呼叫 static 定義的sum ,count
count++; // count the number of students
}
float Student::average()// 如果你在函式前加static 會出錯:

//'static' should not be used on member functions defined at file scope
{ return (sum/count);

   // num = 0;// 非靜態函式不可被static members function 呼叫

}
float Student::sum = 0;// static data member defined must be outside the class
int   Student::count = 0;//


int main()
{
Student std[3]={Student(1001,18,70),Student(1002,19,80),Student(1003,20,90)};
int n;
cout<< "input the number of student";
cin>>n;

for(int i= 0;i<n;i++)
{
   std[i].total();
}
cout<< "the average score of "<<n<<"student is "<< Student::average()<<endl;//invoke static member function
   cout<< "the average score of "<<n<<"student is "<< Student::average()<<endl;//invoke static member function

cout<<" "<<std[0].average()<<endl;// 類的物件可以呼叫 類的static data member

std[1].outputAverage();// 類的物件可以呼叫普通函式who invoke static member function
return 0;
}