八、静态成员变量和成员函数

在 C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供 所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间 的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。

1.静态成员变量

类的静态成员,属于类,也属于对象,但终归属于类。

//声明
static 数据类型 成员变量; //在类的内部

//初始化
数据类型 类名::静态数据成员 = 初值;//在类的外部

//调⽤用
类名::静态数据成员
类对象.静态数据成员


class AA
{
   public:
     AA(int a,int b)
      {
           m_a = a;
           m_b = b;
      }
     int getC(){
            cout<<"c = "<
八、静态成员变量和成员函数_第1张图片
1.png

2.静态成员函数

//声明
static 函数声明

//调用
类名::函数调用
类对象.函数调用

class Student
{
   public:
    Student(int num,double score){
       m_num = num;
       m_score = score;
       count++;
      sum_score +=score;
   }

  static double getAvg(){
     return sum_score/count;
   }

   private:
       int m_num;//学号
       double m_score;//成绩
  
      static int count;//记录目前Student类已经创建了多少个学生对象
      static double sum_score;//所有已经定义学生对象的总score和
};

//在类的外面初始化成员变量
int Student::count = 0;
double Student::sum_score = 0.0;


int main(void){
    Student s1(1,100);
    Student s2(2,90);
    Student s3(3,80);
   
   //使用一个静态的成员函数
    double avg = Student::getAvg();//可以把他当做一个类的全局函数
    cout<<"平均分为:"<

3.总结

3.1静态成员变量

1 static 成员变量实现了同类对象间信息共享。
2 static 成员类外存储,求类大小,并不包含在内。
3 static 成员是命名空间属于类的全局变量,存储在 data 区。
4 static 成员只能类外初始化。
5 可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

3.2静态成员函数

  • 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。
  • 静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时this 指针被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针。

4.编译器堆属性和方法的处理机制

class C1
{
  public:
     int i;//4
     int j;//4
     int k;//4
};//12

class C2
{
  public:
    int i;
    int j;
    int k;
    static int m; //4

 public:
    int getK() const{return k;}//4
    void setK(int val) {k = val;}//4
 };

struct S1{
    int i;
    int j;
    int k;
};//12

struct S2
{
    int i;
    int j;
    int k;
   static int m;
};//12?

int main()
{
  cout<<"c1:"<

5.强化练习-static仓库进货出货

某商店经销一种货物。货物购进和卖出时以箱为单位,各箱的重量不一样,因此,商店需要记录目前库存的总重量。现在用C++模拟商店货物购进和卖出的情形

/*
 static
*/

class Goods
{
    public:
         Goods(){
           weight = 0;
           next = NULL;
            cout<<"创建了一个货物,重量是0"<next = head;
        head = new_goods;
    }
}

//出货的方法
void sale(Goods* &head)
{
   if(head == NULL){
       cout<<"仓库已经没有货物了"<next;
   delete temp;
   cout<<"saled"<>choice;

      switch(choice)
      {
          case 1://进货
              cout<<"请输入要创建的货物的重量"<>w;
               buy(head,w);
               break;
          case 2://出货
              sale(head);
               break;
          case 0:
               return 0;
               break;
          default:
               break;
       }
      cout<<"此时仓库中有"<

你可能感兴趣的:(八、静态成员变量和成员函数)