一.定义
1.声明为static的类数据成员称做静态数据成员
声明为static的类成员函数称做静态成员函数
能在类的范围内共享数据。
2.静态成员不属于某一个单独的对象,而是为类的所有对象所共有
• 根据静态存储的特点,当对象不存在时,仍可以访问该静态成员。
• 静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员: 保证在不依赖于某个对象的情况下,访问静态数据成员。
二.静态数据成员
- 声明方法:static 类型名 变量名;
类的静态数据成员有单独的存储区,不管创建了多少该类的对象,所有对象的静态数据成员共享该存储区,即该类的所有对象维护该成员的同一个拷贝。静态数据成员属于类,在类的范围内有效,可以是公有或私有。 - 类的定义只是给出对象构成的说明,真正的存储空间分配是在对象定义时,由于静态数据成员属于类不属于对象,系统为对象分配存储空间时,不包括静态数据成员的存储空间。所以,**静态数据成员的存储空间需单独分配,且只分配一次。**为静态数据成员分配存储空间称为静态数据成员的定义。
- 不能在成员初始化列表中进行初始化,必须在类外定义和初始化,用(::)来指明所属的类:
类型 类名::静态数据成员[=初始化值]; //必须进行声明
如果未进行初始化,则编译器自动赋初值(默认值是0)
例.静态数据成员的说明和初始化,私有静态数据成员
#include<iostream>
using namespace std ;
class counter
{
static int num ; //私有静态数据成员
public :
void setnum ( int i )
{
num = i ;
}
void shownum()
{
cout << num << '\t' ;
}
} ;
int counter :: num = 0 ; //在类外定义和初始化
int main ()
{
counter a, b ;
a.shownum() ;
b.shownum() ;
a.setnum(10) ;
a.shownum() ;
b.shownum() ;
}
例.使用公有静态数据成员
#include<iostream>
using namespace std ;
class counter
{
public :
counter (int a)
{
mem = a;
}
int mem; //公有数据成员
static int Smem ; //公有静态数据成员
} ;
int counter :: Smem = 1 ; //初始值为1
int main()
{
counter c(5);
int i ;
for( i = 0 ; i < 5 ; i ++ )
{
counter::Smem += i ;
cout << counter::Smem << '\t' ;
}
cout<<endl;
cout<<"c.Smem = "<<c.Smem<<endl;
cout<<"c.mem = "<<c.mem<<endl;
}
三.静态成员函数
1.静态成员函数用于操作静态数据成员,它只能直接引用属于该类的静态数据成员或静态成员函数。
2.类的静态成员是属于类的而不是属于哪一个对象的,它们都不是对象成员。通常定义成公有的,因此,对静态成员的引用不需要用对象名。类外代码可以使用类名和作用域操作符来调用静态成员函数。
3.静态成员函数没有this指针,只能对静态数据操作。
4.定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(参数表);
5.与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:
类名::静态成员函数名(实参表)
对象. 静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
四.题目
某商店经销一种货物,货物成箱进,成箱卖出,购进和卖出都
是以重量为单位(每箱的重量不同),商店需要记录下存货的
总重量。
方法一:设计包含静态数据成员的类
#include <iostream>
using namespace std;
class Goods
{
int weight;
static int total_weight;
public:
Goods(int x):weight(x) { }
void in()
{
total_weight+=weight;
}
void out()
{
total_weight-=weight;
}
static void display_store();
};
int Goods::total_weight=0;
void Goods::display_store(){ cout<<total_weight<<endl; }
int main()
{
Goods g1(10),g2(20);
g1.in();
g2.in();
Goods::display_store();
g2.display_store();
g1.out();
Goods::display_store();
return 0;
}
方法二:设计包含静态数据成员的类
#include <iostream>
using namespace std;
class Goods
{
int weight;
static int total_weight;
public:
Goods(int x):weight(x) { }
void in()
{
total_weight+=weight;
}
void out()
{
total_weight-=weight;
}
static void display_store()
{
cout<<total_weight<<endl;
}
};
int Goods::total_weight=0;
int main()
{
Goods g1(10),g2(20);
g1.in();
g2.in();
Goods::display_store();
g2.display_store();
g1.out();
Goods::display_store();
return 0;
}