码迷,mamicode.com
首页 > 其他好文 > 详细

静态成员函数

时间:2015-06-29 16:12:25      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

静态成员函数是类的成员函数,该函数不属于该类申请的任何一个对象,而是所有该类成员共同共有的一个函数。 
举个例子给你,你们班里面有10个人(10个比如高一一班的对象),体育老师分给你们一个篮球(静态成员函数),
你们每个人都带了一个篮球(非静态成员函数),你们都很小气,自己的球只能自己拍,要是5对5打比赛,
那就只能用那个静态的篮球了(每个人都可以拿来用,但是带来的影响是对全体的)。因此,我可以说那个篮球是
高一一班的成员。所以也就是说:静态成员函数是类的成员函数(因为高一二班就不能拿来玩),但是这个篮球最
后还是要还给老师的,任何私人不得占有。希望这样你能明白,其实在机器结构里面说白了静态的成员的内存是唯
一的一份,就是当你在类外声明他时开辟的,但是非静态函数的空间分配是在你实例化对象时创建的。希望你能明
白,第一次在百度知道里面回答,以前都是来查。。。。

和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如
Box∷volume( );
实际上也允许通过对象名调用静态成员函数,如
a.volume( );
但这并不意味着此函数是属于对象a的,而只是用a的类型而已。
静态成员函数的作用是为了能处理静态数据成员。
可以说,静态成员函数与非静态成员函数的根本区别是: 非静态成员函数有this指针静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句:
cout<<height<<endl; //若height已声明为static,则引用本类中的静态成员,合法
cout<<width<<endl; //若width是非静态数据成员,不合法
但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如
cout<<a.width<<endl; //引用本类对象a中的非静态成员
假设a已定义为Box类对象,且在当前作用域内有效,则此语句合法。
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Student                   //定义Student类
 6 {
 7     public:
 8 
 9     Student(int n,int a,float s):num(n),age(a),score(s){ }      //定     义构造函数
10 
11 void total( );
12 
13 static float average( );      //声明静态成员函数
14 
15 private:
16 
17 int num;
18 
19 int age;
20 
21 float score;
22 
23 static float sum;            //静态数据成员
24 
25 static int count;            //静态数据成员
26 
27 };
28 
29 void Student∷total( )                      //定义非静态成员函数
30 {
31     sum+=score;                            //累加总分
32 
33     count++;                               //累计已统计的人数
34 }
35 
36 
37 float  Student∷average( )                  //定义静态成员函数
38 {
39     return(sum/count);
40 }
41 
42 
43 
44 float Student∷sum=0;                     //对静态数据成员初始化
45 
46 int Student∷count=0;                     //对静态数据成员初始化
47 
48 
49 
50 int main( )
51 {
52 Student stud[3]={                      //定义对象数组并初始化
53 
54 Student(1001,18,70),
55 
56 Student(1002,19,78),
57 
58 Student(1005,20,98)
59 };
60 
61 int n;
62 
63 cout<<〃please input the number of students:〃;
64 
65  cin>>n;                               //输入需要求前面多少名学生的平均成绩
66 
67  for(int i=0;i<n;i++)                  //调用3次total函数
68 
69 stud[i].total( );
70 
71  cout<<〃the average score of 〃<<n<<〃 students is 〃<<Student∷average( )<<endl;
72 
73 //调用静态成员函数
74 
75 return 0;
76 
77 }
78 
79 运行结果为
80 
81 please input the number of students:382 
83 the average score of 3 students is 82.3333
说明: 
(1) 在主函数中定义了stud对象数组,为了使程序简练,只定义它含3个元素,分别存放3个学生的数据。程序的作用是先求用户指定的n名学生的总分,然后求平均成绩(n由用户输入)。
(2) 在Student类中定义了两个静态数据成员sum(总分)和count(累计需要统计的学生人数),这是由于这两个数据成员的值是需要进行累加的,它们并不是只属于某一个对象元素,而是由各对象元素共享的,可以看出: 它们的值是在不断变化的,而且无论对哪个对象元素而言,都是相同的,而且始终不释放内存空间。
(3) total是公有的成员函数,其作用是将一个学生的成绩累加到sum中。公有的成员函数可以引用本对象中的一般数据成员(非静态数据成员),也可以引用类中的静态数据成员。score是非静态数据成员,sum和count是静态数据成员。
(4) average是静态成员函数,它可以直接引用私有的静态数据成员(不必加类名或对象名),函数返回成绩的平均值。
(5) 在main函数中,引用total函数要加对象名(今用对象数组元素名),引用静态成员函数average函数要用类名或对象名。

静态成员函数

标签:

原文地址:http://www.cnblogs.com/lpxblog/p/4607431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!