在C ++中定义类string常量?

我已经看到了这两种风格的代码,我不确定是否比另一种更好(这只是一个风格问题)? 你有什么build议,你会select一个在另一个。

//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"; 

通常你应该更喜欢std::string不是简单的字符指针。 然而,在这里,用string文字初始化的字符指针有很大的好处。

有两个初始化静态数据。 一个称为静态初始化,另一个称为dynamic初始化。 对于那些用常量expression式初始化并且是POD(像指针)的对象,C ++要求在dynamic初始化发生之前,它们的初始化就在一开始就发生。 初始化这样的std :: string将会dynamic完成。

如果在某个文件中有一个类的对象是一个静态对象,并且需要在初始化过程中访问这个string,那么在使用const char* const版本的时候,可以依赖它的设置。没有静态初始化的std::string版本,你不知道这个string是否已经被初始化 – 因为没有定义跨翻译单元边界的对象的初始化顺序。

嗯,std :: string和const char *不一样。 我通常在使用std :: string的时候犯错,因为它是一个具有许多附加function的类,使得它更容易使用。

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

在使用C ++时,我倾向于赞成std :: string在char *之上。 我更喜欢std :: string主要是因为它的内置function以及不需要处理指针的方便性和安全性。

但是,正如其他人所提到的,如果你过于关心性能,const char *版本可能会是有利的。 我似乎记得有一个聪明的人曾经说过早的优化是万恶之源(或者其他一些)的根源。 🙂

第一个例子需要较less的开销来pipe理string(即,只是指向TEXT部分的指针)。 此外,第二种方法也可能需要堆分配,以便将string文字复制到std:string类缓冲区。 所以,你最终会得到两份数据。

在涉及多个平台的大型项目中,使用不同的编译器和库,许多团队以及许多人,我们反复遇到了使用静态std :: strings的问题。 在某些平台上,std:string实现不是线程安全的。 在一个平台上,编译器优化的代码跳过了初始化全局静态常量的本地std:string。 追逐这些问题的一些我们只允许全局静态常量为内置types。

第二个版本的优点是它具有预先计算的长度以及丰富的string类别的其他好处。 第一个优点是唯一的初始化就是分配一个指向已经加载到可执行映像中的静态数据的指针,第二个必须从同一个指针初始化string。

首先,如果不会使用char *。 如果你想要一个ASCIIZstring,直接定义其中之一:

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

大多数情况下,这就是我所用的。 为什么浪费时间和内存的string类的开销。

请注意,“sizeof(Test :: str)”将准确地给你数组的长度,这是string的长度,包括终止NUL(strlen(str)+1)。