派生类对象中静态变量的行为:基类副本与字符串使用疑问
关于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
相关产品推荐
相关产品推荐

