C++ 之静态成员static

静态数据成员

静态数据成员特点:在每个类中只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。
静态数据成员的定义格式:

static 类型标识符 静态数据成员名;

静态数据成员的初始化:

类型标识符 类名::静态数据成员名 = 初始值;

说明:

  • 静态数据成员属于类所有对象共有,占一份内存空间;
  • 静态数据成员在程序开始编译时就分配空间,而不是某个对象创建时分配的。也不随对象的撤销而释放,而是程序结束才释放空间;
  • 初始化在类体外进行,且前面不加static,以免与一般静态变量想混淆;
  • 初始化时不加该成员的访问权限修饰符private、public等。
  • 初始化时使用作用域运算符来表明他所属类,因此,静态数据成员是类的成员,而不是对象的成员。

静态数据成员不属于任何一个对象,可以通过类名直接对他进行访问,一般用法:

类名::静态数据成员

例1:

#include <iostream>
using namespace std;
 
class Box
{
   public:
      static int objectCount;
      // 构造函数定义
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次创建对象时增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // 长度
      double breadth;    // 宽度
      double height;     // 高度
};
 
// 初始化类 Box 的静态成员
int Box::objectCount = 0;
 
int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // 声明 box1
   Box Box2(8.5, 6.0, 2.0);    // 声明 box2
 
   // 输出对象的总数
   cout << "Total objects: " << Box::objectCount << endl;
 
   return 0;
}

结果:

Constructor called.
Constructor called.
Total objects: 2

静态成员函数

  • 静态成员函数定义:
static 函数类型 静态成员函数名(参数表);
  • 静态成员函数的调用格式:
类名::静态成员函数名(参数表);
  • 静态成员函数特点:

    • 共有静态成员,可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。静态成员函数可以由类名通过”::“直接调用;
    • 静态成员函数可以直接访问该类的静态数据成员和静态成员函数,不能直接访问非静态数据成员和成员函数。
  • 静态成员函数与普通成员函数的区别:

    • 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
    • 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。

例2:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      static int objectCount;
      // 构造函数定义
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次创建对象时增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
      static int getCount()
      {
         return objectCount;
      }
   private:
      double length;     // 长度
      double breadth;    // 宽度
      double height;     // 高度
};
 
// 初始化类 Box 的静态成员
int Box::objectCount = 0;
 
int main(void)
{
  
   // 在创建对象之前输出对象的总数
   cout << "Inital Stage Count: " << Box::getCount() << endl;
 
   Box Box1(3.3, 1.2, 1.5);    // 声明 box1
   Box Box2(8.5, 6.0, 2.0);    // 声明 box2
 
   // 在创建对象之后输出对象的总数
   cout << "Final Stage Count: " << Box::getCount() << endl;
 
   return 0;
}

结果:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xp_fangfei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值