为了账号安全,请及时绑定邮箱和手机立即绑定

您好,请问如果不将average函数定义为静态成员函数行不行?有什么影响吗?

您好,请问如果不将average函数定义为静态成员函数行不行?有什么影响吗?

弑天下 2022-01-07 11:07:14
#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;}
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

为什么要用静态成员函数?

从上述修改中可以看出,不使用静态成员函数显然也能实现相同的功能,那么,为什么要使用静态成员函数呢?

如果把average函数定义为非静态成员函数,那么主函数中将出现stud[1](当然,换成stud[0]或者stud[2]也可以),stud[1]的出现破坏了主函数中语句的逻辑性。他人在阅读主函数时看到stud[1]也许会有疑问:这里为什么要用stud[1]的成员函数,有什么特殊含义吗?是不是this指针必须在指向stud[1]的时候才能求得正确的平均值?降低了主函数的可读性。

静态成员函数主要是用来处理静态数据成员的,而静态数据成员不只属于某一个对象,它是为“全部同类对象”所共用的。因此,定义静态成员函数的目的在于处理“全部同类对象”的共同问题。

静态成员函数不属于某一个特定的对象,因为把一个处理“全部同类对象”共同问题的函数定义为某个对象所有是不合逻辑的。静态成员函数直接使用类名和域运算符调用,提高了语句的逻辑性和可读性。

楼上认为,使用静态成员函数的原因在于,不论有没有定义对象,静态成员函数都可以直接被调用。这的确是静态成员函数的一个特点,但是把它作为使用静态成员函数的原因未免有些牵强。试想,在没有定义对象的情况下,调用静态成员函数又有什么意义呢?

也许有人会说,在没有定义对象的情况下,静态成员函数还可以对静态数据成员进行操作啊。是的,的确可以,可是静态数据成员又是为谁而设的呢?没有定义对象,数据成员也变的没有意义了。

综上,静态成员函数的使用,提高了语句的逻辑性和可读性。

查看完整回答
反对 回复 2022-01-09
?
喵喔喔

TA贡献1735条经验 获得超5个赞

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



查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 532 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信