C++ 数据的共享 静态数据成员和静态函数成员

简介: C++ 数据的共享 静态数据成员和静态函数成员

1.静态数据成员


1.描述


在类中,如果某个属性为整个类所共有,不属于类的任何一个对象,则为类的静态成员,用 static 关键字声明,静态成员在每个类中只有一份,由类的所有对象共同维护和使用;


2.特点:


静态数据成员具有静态生存期(与动态生存期区别,类似于全局变量);

静态数据成员需要定义两次,类内类外各定义一次,为它们分配专门的空间,


3.例子:


简单学生信息记录系统,用静态数据成员count记录总学生数


#include<bits/stdc++.h>
using namespace std;
class Student{
  public:
  Student(int age1=0,int weight1=0)//默认构造函数 
  {
    age=age1;
    weight=weight1;
    count++;//调用默认构造函数时个数加一 
  }
  Student(Student &st)//复制构造函数 
  {
    age=st.age;
    weight=st.weight;
    count++;//调用复制构造函数时个数加一 
  }
  ~Student()//析构函数 
  {
    count--;  
  } 
  int reAge(int age1){age=age1;}//修改年龄 
  int reweight(int weight1){weight=weight1;}//修改体重 
  int getAge(){return age;}//获得年龄 
  int getweight(){return weight;}//获得体重 
  int getcount()
  {
    return count;//获得人数 
  }//对外接口  
  private:
  int age;
  int weight;
  static int count;//内部声明静态数据成员 
};
int Student::count=0;//外部声明  赋值并分配专门空间 
int main() 
{
  Student a(12,120);
  cout<<a.getcount();
  cout<<endl;//调用默认构造函数并查看总人数 
  a.reAge(13);
  cout<<a.getAge()<<" "<<a.getcount();
  cout<<endl;//调用修改函并查看总人数 
  Student b=a;
  cout<<b.getAge()<<" "<<b.getcount();
  //调用复制构造函数并查看总人数 
  return 0; 
}



结果:


image.png


2.静态函数成员


1.描述


在静态数据成员中,要输出count时必须通过一个具体对象调用函数才能输出count的值,但是在声明对象之前无法输出count的值,即使这时count的值为 0 ,这时我们可以用静态成员函数来访问静态数据成员,一般用类名来访问;


2.特点:


静态函数成员一般通过类名来调用,访问非静态的函数成员必须通过对象名调用;

只需在调用静态数据成员的函数前加上 static 关键字;

通过 类名::函数名来调用静态函数成员


3.例子


在静态数据成员的基础上改写函数:


#include<bits/stdc++.h>
using namespace std;
class Student{
  public:
  Student(int age1=0,int weight1=0)//默认构造函数 
  {
    age=age1;
    weight=weight1;
    count++;//调用默认构造函数时个数加一 
  }
  Student(Student &st)//复制构造函数 
  {
    age=st.age;
    weight=st.weight;
    count++;//调用复制构造函数时个数加一 
  }
  ~Student()//析构函数 
  {
    count--;  
  } 
  int reAge(int age1){age=age1;}//修改年龄 
  int reweight(int weight1){weight=weight1;}//修改体重 
  int getAge(){return age;}//获得年龄 
  int getweight(){return weight;}//获得体重 
  static int getcount()
  {
    return count;//获得人数 
  }//对外接口  
  private:
  int age;
  int weight;
  static int count;//内部声明静态数据成员 
};
int Student::count=0;//外部声明  赋值并分配专门空间 
int main() 
{
  cout<<Student::getcount();//未声明任何对象但是查看人数 
  cout<<endl;
  Student a(12,120);
  cout<<Student::getcount();
  cout<<endl;//调用默认构造函数并查看总人数 
  a.reAge(13);
  cout<<a.getAge()<<" "<<Student::getcount();
  cout<<endl;//调用修改函并查看总人数 
  Student b=a;
  cout<<b.getAge()<<" "<<Student::getcount();
  //调用复制构造函数并查看总人数 
  return 0; 
}



结果:


ba0a845a885c1be6df5f6cdbdb1963fe_b8e3d86852b947609eb5bf6e11eaae8b.png


3.小结:


静态数据成员就像全局变量一般,有全局的生存期,是所有类和对象共同使用和维护属性,而静态函数成员有能很方便地调用静态数据成员,很好地完成了数据的共享;


目录
相关文章
|
2月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
29天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
82 5
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
38 3
|
2月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
46 1
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
40 3
|
2月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
52 3
|
2月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
24 3
|
2月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
2月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(二):类的默认成员函数详解
【C++篇】C++类与对象深度解析(二):类的默认成员函数详解
26 2
|
2月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元