zoukankan      html  css  js  c++  java
  • 静态成员函数

    静态成员函数是类的成员函数,该函数不属于该类申请的任何一个对象,而是所有该类成员共同共有的一个函数。 
    举个例子给你,你们班里面有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函数要用类名或对象名。
  • 相关阅读:
    PHP快速排序算法
    PHP选择排序算法
    php几个常用的概率算法(抽奖、广告首选)
    免费Git客户端:sourcetree详细介绍
    apidoc @apiGroup兼容中文
    PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装
    mysql-表分区
    mysql表优化
    MySQL执行计划extra中的using index 和 using where using index 的区别
    mysql-锁
  • 原文地址:https://www.cnblogs.com/lpxblog/p/4607431.html
Copyright © 2011-2022 走看看