静态成员

一.定义

1.声明为static的类数据成员称做静态数据成员
声明为static的类成员函数称做静态成员函数
能在类的范围内共享数据。
2.静态成员不属于某一个单独的对象,而是为类的所有对象所共有
• 根据静态存储的特点,当对象不存在时,仍可以访问该静态成员。
• 静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员: 保证在不依赖于某个对象的情况下,访问静态数据成员。

二.静态数据成员

  1. 声明方法:static 类型名 变量名;
    类的静态数据成员有单独的存储区,不管创建了多少该类的对象,所有对象的静态数据成员共享该存储区,即该类的所有对象维护该成员的同一个拷贝。静态数据成员属于类,在类的范围内有效,可以是公有或私有
  2. 类的定义只是给出对象构成的说明,真正的存储空间分配是在对象定义时,由于静态数据成员属于类不属于对象,系统为对象分配存储空间时,不包括静态数据成员的存储空间。所以,**静态数据成员的存储空间需单独分配,且只分配一次。**为静态数据成员分配存储空间称为静态数据成员的定义。
  3. 不能在成员初始化列表中进行初始化,必须在类外定义和初始化,用(::)来指明所属的类:
    类型 类名::静态数据成员[=初始化值]; //必须进行声明
    如果未进行初始化,则编译器自动赋初值(默认值是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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值