在C++中定义类字符串常量?

kal*_*kal 41 c++

我已经看到了这两种风格的代码,我不确定一个是否比另一个更好(它只是风格问题)?你有什么建议可以选择一个而不是另一个.

 //Example1
 class Test {

    private:
        static const char* const str;

};

const char* const Test::str = "mystr";

//Example2
class Test {

     private:
         static const std::string str;

};

const std::string Test::str ="mystr";
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 56

通常你应该更喜欢std::string普通的char指针.但是,这里使用字符串文字初始化的char指针具有显着的好处.

静态数据有两个初始化.一个称为静态初始化,另一个称为动态初始化.对于那些使用常量表达式初始化并且是POD(如指针)的对象,C++要求在动态初始化发生之前,在初始阶段进行初始化.初始化这样的std :: string将动态完成.

如果某个类的对象在某个文件中是静态对象,并且在初始化期间需要访问该字符串,那么在使用该const char* const版本时,您可以依赖它来设置,同时使用该std::string版本,如果没有静态初始化,则不知道字符串是否已初始化 - 因为未定义跨转换单元边界的对象初始化顺序.

  • +1我花时间调试一些非常讨厌的崩溃,结果是由于初始化顺序问题导致的字符串类的静态实例导致的崩溃.避免使用`std :: string`的静态实例! (7认同)