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

时间:2009-01-20 02:23:24

标签: 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";

7 个答案:

答案 0 :(得分:56)

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

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

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

答案 1 :(得分:4)

嗯,std :: string与const char *不同。我通常在使用std :: string时犯错,因为它是一个具有许多附加功能的类,使其更易于使用。

如果性能是最重要的,并且您使用const char *来提高效率,那么就这样。

答案 2 :(得分:3)

在做C ++时,我倾向于使用std :: string而不是char *。我更喜欢std :: string,主要是因为它内置的功能以及不必处理指针的方便性和安全性。

然而,正如其他人所提到的,如果您过分关注性能,那么const char *版本可能会有利。我似乎记得有人聪明曾经说过早优化是所有邪恶(或某些此类)的根源。 :)

答案 3 :(得分:2)

第一个示例需要较少的管理字符串的开销(即,只是指向TEXT部分的指针)。此外,第二种方法也可能需要堆分配以将字符串文字复制到std:string类缓冲区。因此,您最终会获得两份数据副本。

答案 4 :(得分:2)

在涉及具有不同编译器和库的多个平台的大型项目中,许多团队和许多人反复遇到静态std :: strings的问题。在某些平台上,std:string实现不是线程安全的。在一个平台上,编译器优化代码跳过从全局静态const初始化本地std:string。在追逐其中一些问题之后,我们只允许内置类型的全局静态函数。

答案 5 :(得分:1)

第二个版本的优势在于它具有预先计算的长度以及充实的字符串类的其他好处。第一个优点是唯一的初始化只是为已经加载到可执行映像中的静态数据指定一个指针,其中第二个初始化必须从同一个指针初始化字符串。

答案 6 :(得分:1)

首先,如果不使用char *。如果需要ASCIIZ字符串,请直接定义其中一个:

const char Test::str[] = "mystr";

在大多数情况下,这就是我使用的。为什么浪费时间和内存来处理字符串类的开销。

请注意,“sizeof(Test :: str)”将准确地给出数组的长度,即字符串的长度,包括终止NUL(strlen(str)+1)。