C++学习(五) 静态数据成员和静态成员函数

1、静态成员:

1.1、说明

静态成员包括静态数据静态成员函数

(1)、静态数据成员的定义与普通数据成员相似,但要在前面加static关键字。

(2)、静态变量一定要进行初始化:一般初始化位置在main函数之前、类声明之后。

1.2、格式

初始化格式:
数据类型 类名::静态数据成员名=初始值;

示例如下:

#include<iostream>
using namespace std;
class score{
	public:
	static int number;//静态数据成员
	 ... 
};
...
int score::number=0;  //对静态数据成员初始化

(3)、静态数据成员属于类,因此可以使用”类名::”访问静态的数据成员。

访问格式:
类名::静态数据成员名

(4)、静态数据成员与静态变量一样,是在编译时创建并初始化。在该类的任何对象被建立之前就存在。

公有的静态数据成员可以在对象定义之前被访问。

对象定义后,公有的静态数据成员也可以通过对象进行访问。

用对象访问静态数据成员的格式如下:
对象名.静态数据成员名;
对象指针->静态数据成员名;

示例如下:

#include<iostream>
using namespace std;
class score{
 public:
  static int number;  //定义静态成员 
};
int score::number=0;  //对静态数据成员初始化 
int main()
{
 score::number=10;    //公有静态数据成员可以在对象定义之前被访问
 score ob,*p;
 p=&ob;
 cout<<"ob.number:"<<ob.number<<endl;         //通过对象访问公有静态数据成员number
 cout<<"score::number:"<<score::number<<endl; //通过类名访问公有静态数据成员number
 cout<<"p->number"<<p->number<<endl;          //通过对象指针公有静态数据成员number
 return 0;  
}

运行结果如下:

ob.number:10
score::number:10
p->number10

(5)、在类外,私有的静态数据成员不能被直接访问,必须通过公有的成员函数访问。

(6)、C++支持静态数据成员的一个主要原因是可以不必使用全局变量。

2、静态成员函数

2.1、说明

静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而静态成员函数没有this指针。

一般而言,静态成员函数不访问类中的非静态成员。若确实需要访问非静态数据成员,静态成员函数只能通过对象名(或对象指针、对象引用)访问该对象的非静态成员。

2.2、格式

定义静态成员函数的格式如下:
static 返回类型 静态成员函数名();

调用公有静态成员函数的一般格式为:
类名::静态成员函数名()
对象.静态成员函数名()
对象指针->静态成员函数名()

示例代码如下:

#include <iostream>
using namespace std;
class score{
 public:       //公有
   score(int a,int b);        //公有成员函数 
   static void showscore();   //静态成员函数
 private:     //私有 
   int mid_exam;              //私有成员函数 
   int fin_exam;              //私有成员函数
   static int count;          //统计数量 
   static double sum;         //统计累加值 
   static double ave;         //统计平均值 
};
score::score(int a,int b)
{
 count++;                     //累加数量 
 mid_exam=a;
 fin_exam=b;
 sum+=fin_exam;               //累加值
 ave=sum/count;               //平均值
 } 
 void score::showscore()
 {
  cout<<"人数"<<count<<endl; 
  cout<<"累加分数"<<sum<<endl;
  cout<<"平均成绩"<<ave<<endl; 
 }
 int score::count=0;         //初始化 
 double score::sum=0.0;
 double score::ave=0.0;
 int main()
 {
  score rec[3]={            //定义对象数组 
  score(70,71),
  score(80,81),
  score(90,91)
  };
  rec[3].showscore();      //用对象名访问 
  score::showscore();      //用类名访问 
  return 0;
 }

运行结果如下:

人数3
累加分数243
平均成绩81
人数3
累加分数243
平均成绩81

(1)、一般情况下,静态函数成员主要用来访问静态数据成员。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。

(2)、私有静态成员函数不能被类外部的函数和对象访问。

(3)、可以用静态成员函数在建立任何一个对象之前调用静态成员函数,以处理静态数据成员。

(4)、静态成员函数是类的一部分,而不是对象的一部分。

如果要在类外调用公有的静态成员函数,使用如下格式较好:
类名::静态成员函数名()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值