如果不将average函数定义为静态成员函数行不行?需要做什么修改?为什么这样改?为什么要用静态成员函数?

#include <iostream>
using namespace std;
class 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++)
stud[i].total();
cout<<"the average score of"<<n<<"student is"<<Student::average()<<endl;
return 0;
}
//请大侠把修改后的代码贴出来,或者把需要修改的地方修改了说一下

静态成员函数只能访问静态成员变量。换句话说,如果一个函数只访问了静态成员变量,那么就可以把这个函数设为静态成员函数。而如果去掉static,也是完全可以的。
static float average();把static去掉
cout<<"the average score of"<<n<<"student is"<<Student::average()<<endl;这里,因为只有静态成员函数可以用类名加::的方式访问,所以也要修改下,比如:stud[0].average()就行了。
至于“如果不赋初值可不可以”,如果你在其他函数里引用到了一个静态成员变量,而这个静态成员变量没有初始化,那么就会出现链接错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-15
1. 如果不将average函数定义为静态成员函数行不行?
行,其实很多写法都行。

2. 需要做什么修改?
average声明时去掉static ,
然后,
float Student::average()
{
return (Student::sum / Student::count);
}
然后,
cout<<"the average score of"<<n<<"student is"<<stud[0].average()<<endl;

3. 为什么这样改?

这样可以让非静态成员函数访问静态成员变量。

4. 为什么要用静态成员函数?
静态成员函数可以访问静态成员变量。

5.
float Student::sum=0;//如果不赋初值可不可以
int Student::count=0;//如果不赋初值可不可以
不可以。
相似回答