静态成员变量与非静态成员变量

什么是静态成员变量?

静态成员变量是属于类本身的变量,而不是类的实例(对象)的变量。它们与类相关联,而不是与类的每个实例相关联。静态成员变量在整个类的所有实例之间是共享的,只有一个实例存在于内存中。

与实例变量不同,静态成员变量不依赖于特定的对象实例,因此可以在没有创建类实例的情况下访问它们。它们可以在类内部或外部进行定义和初始化,并且可以通过类名加上作用域解析运算符::来访问。静态成员变量的值在所有实例之间是共享的,当一个实例修改了静态成员变量的值,其他实例也会受到影响。

以下面这段代码为例,Planner planner;创建了一个名为planner的Planner对象。然而,并没有使用这个对象或调用其成员函数。block_buffer是Planner类的一个静态成员变量。静态成员变量属于类本身,而不是类的实例。它们在类的所有实例之间共享,并且可以通过类名和作用域解析运算符::来访问。在这段代码中,block_buffer被声明为一个静态数组,它的类型是block_t,大小为BLOCK_BUFFER_SIZE。静态成员变量在程序运行期间只有一个实例,无论创建了多少个类的实例。

通过将block_buffer声明为静态成员变量,它可以在类的其他成员函数中共享和访问,而不需要创建类的实例。这使得可以在不创建Planner对象的情况下,直接通过类名Planner::block_buffer来访问该静态成员变量。

Planner planner;

// public:

/**
 * A ring buffer of moves described in steps
 */
block_t Planner::block_buffer[BLOCK_BUFFER_SIZE];
volatile uint8_t Planner::block_buffer_head,    // Index of the next block to be pushed
                 Planner::block_buffer_nonbusy, // Index of the first non-busy block
                 Planner::block_buffer_planned, // Index of the optimally planned block
                 Planner::block_buffer_tail;    // Index of the busy block, if any
uint16_t Planner::cleaning_buffer_counter;      // A counter to disable queuing of blocks
uint8_t Planner::delay_before_delivering;

静态成员变量通常用于表示与类相关的全局数据或共享数据,或者用于在类的所有实例之间共享状态或信息。它们可以在类的方法中使用,也可以在类的外部通过类名来访问。

举一个简单的例子来说明静态成员变量和非静态成员变量的区别。

假设我们有一个Car(汽车)类,其中有两个成员变量:maxSpeed(最大速度)和carCount(汽车数量)。maxSpeed表示所有汽车的最大速度,而carCount表示创建的汽车对象的数量。

class Car {
public:
    int maxSpeed;          // 非静态成员变量
    static int carCount;   // 静态成员变量

    Car(int speed) {
        maxSpeed = speed;
        carCount++;
    }
};

在这个例子中,maxSpeed是一个非静态成员变量。它的值是与每个汽车对象相关联的,并且每个汽车对象都有自己的maxSpeed值。每当创建一个新的汽车对象时,它的maxSpeed会被初始化为指定的速度。

carCount是一个静态成员变量。它的值与类相关联,而不是与每个汽车对象相关联。无论创建多少个汽车对象,它们都共享同一个carCount变量。每当创建一个新的汽车对象时,carCount会递增,记录创建的汽车对象的数量。

以下是如何使用这个Car类的示例代码:

int main() {
    Car car1(200);
    Car car2(180);
    Car car3(220);

    cout << "Car 1 max speed: " << car1.maxSpeed << endl;
    cout << "Car 2 max speed: " << car2.maxSpeed << endl;
    cout << "Car 3 max speed: " << car3.maxSpeed << endl;

    cout << "Total car count: " << Car::carCount << endl;

    return 0;
}

输出结果:

Car 1 max speed: 200
Car 2 max speed: 180
Car 3 max speed: 220
Total car count: 3

在这个例子中,每个汽车对象有自己的maxSpeed值,但它们共享相同的carCount值,因为carCount是静态成员变量。

总结:

非静态成员变量(实例变量)的值与每个对象实例相关联,每个对象有自己的变量副本。
静态成员变量的值与类相关联,多个对象共享相同的变量副本。

参考:C++中类的(static)静态成员变量与(static)静态成员函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值