You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

派生类对象中静态变量的行为:基类副本与字符串使用疑问

关于C++中static关键字的两个问题解答

1. 基类的int静态变量,派生类对象是否共享同一副本?

嘿,答案是肯定的——所有基类和派生类的对象,都会共享这个静态变量的唯一副本。

原因很简单:静态成员变量的本质是属于类本身,而非某个对象实例。它在程序启动时就会被初始化,内存中只存在一份,不管你创建多少个基类或派生类的对象,访问的都是这同一个变量。派生类会继承基类的静态成员,但不会为它创建新的副本。

给你看个直观的代码示例:

#include <iostream>
using namespace std;

class Base {
public:
    static int shared_num;
};

// 静态成员必须在类外完成初始化
int Base::shared_num = 0;

// 派生类继承Base
class Derived : public Base {};

int main() {
    Base b_obj;
    Derived d_obj;

    // 通过基类对象修改静态变量
    b_obj.shared_num = 7;
    // 派生类对象访问的是同一个变量
    cout << "Derived对象访问shared_num: " << d_obj.shared_num << endl; // 输出7

    // 通过派生类对象修改
    d_obj.shared_num = 15;
    // 直接用基类名访问,结果也是15
    cout << "Base类直接访问shared_num: " << Base::shared_num << endl; // 输出15

    return 0;
}

运行这段代码就能看到,不管用哪种方式访问,操作的都是同一个shared_num变量。

2. static关键字是否可用于字符串类型?

当然可以!static可以和各种字符串类型结合使用,常见的场景有这几种:

  • 修饰std::string变量:
    比如在函数里定义局部静态字符串:

    #include <string>
    #include <iostream>
    void print_str() {
        static std::string static_str = "我是静态字符串";
        static_str += ",又被调用啦!";
        std::cout << static_str << std::endl;
    }
    

    这个static_str只会初始化一次,生命周期贯穿整个程序,每次调用函数都会追加内容。

  • 修饰C风格字符串数组:
    比如定义静态字符数组存储字符串:

    static char static_buf[30] = "C风格静态字符串";
    

    这种数组会被放在静态存储区,不会像局部数组一样在函数结束后销毁。

  • 修饰指向字符串字面量的指针:
    字符串字面量本身存在只读存储区,用static修饰指针可以让指针本身的生命周期延长到整个程序:

    static const char* literal_ptr = "静态字面量指针";
    

    这里一定要加const,因为字符串字面量是不能被修改的,强行修改会导致未定义行为。

内容的提问来源于stack exchange,提问作者NodeJS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:14