您好,请问如果不将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;
int Student::count;
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;
}



弑天下
浏览 533回答 2
2回答

繁星淼淼

为什么要用静态成员函数?从上述修改中可以看出,不使用静态成员函数显然也能实现相同的功能,那么,为什么要使用静态成员函数呢?如果把average函数定义为非静态成员函数,那么主函数中将出现stud[1](当然,换成stud[0]或者stud[2]也可以),stud[1]的出现破坏了主函数中语句的逻辑性。他人在阅读主函数时看到stud[1]也许会有疑问:这里为什么要用stud[1]的成员函数,有什么特殊含义吗?是不是this指针必须在指向stud[1]的时候才能求得正确的平均值?降低了主函数的可读性。静态成员函数主要是用来处理静态数据成员的,而静态数据成员不只属于某一个对象,它是为“全部同类对象”所共用的。因此,定义静态成员函数的目的在于处理“全部同类对象”的共同问题。静态成员函数不属于某一个特定的对象,因为把一个处理“全部同类对象”共同问题的函数定义为某个对象所有是不合逻辑的。静态成员函数直接使用类名和域运算符调用,提高了语句的逻辑性和可读性。楼上认为,使用静态成员函数的原因在于,不论有没有定义对象,静态成员函数都可以直接被调用。这的确是静态成员函数的一个特点,但是把它作为使用静态成员函数的原因未免有些牵强。试想,在没有定义对象的情况下,调用静态成员函数又有什么意义呢?也许有人会说,在没有定义对象的情况下,静态成员函数还可以对静态数据成员进行操作啊。是的,的确可以,可是静态数据成员又是为谁而设的呢?没有定义对象,数据成员也变的没有意义了。综上,静态成员函数的使用,提高了语句的逻辑性和可读性。

喵喔喔

代码就不写了 直接解释你的问题吧,average函数如果不设置为静态成员函数,那么你需要实例化一个class Student对象去调用average函数class Stu=new Student();Stu.average(); 之类的。简单的说就是如果函数不是静态的,那么当创建一个对象的时候,这个对象的函数才创建,这也就是为什么需要对象实例化才能去调用一个非静态函数了。如果使用静态成员函数,就无需创建对象去访问,即使这样是可行的(JAVA里这样,C++呢?),因为不管对象创建与否,静态成员函数总是能够被访问。
打开App,查看更多内容
随时随地看视频慕课网APP