亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您好,請問如果不將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 關注
  • 568 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號