C++ 指向const char vs char array vs std::string的指针

C++ 指向const char vs char array vs std::string的指针,c++,C++,这里有两行代码 const char * s1 = "test"; char s2 [] = "test"; 这两行代码都有相同的行为,所以我看不出我更喜欢s1而不是s2有什么区别,反之亦然。除了s1和s2之外,还有使用std::string的方法。我认为使用std::string的方式是最优雅的。在查看其他代码时,我经常看到人们要么使用const char*要么char s[]。因此,我现在的问题是,我应该在什么时候使用const char*s1或char s[]或std::string?区

这里有两行代码

const char * s1 = "test";
char s2 [] = "test";
这两行代码都有相同的行为,所以我看不出我更喜欢
s1
而不是
s2
有什么区别,反之亦然。除了s1和s2之外,还有使用
std::string
的方法。我认为使用std::string的方式是最优雅的。在查看其他代码时,我经常看到人们要么
使用const char*
要么
char s[]
。因此,我现在的问题是,我应该在什么时候使用
const char*s1
char s[]
std::string
?区别是什么?在什么情况下我应该使用哪种方法

const char * s1 = "test";
char s2 [] = "test";
这两个不一样
s1
是不可变的:它指向恒定内存。修改字符串文字是未定义的行为


是的,在C++中,你应该更喜欢<代码> STD::String < /代码>。

< P>第一个是常数,第二个不是常数。string是一种类类型,它实现了许多有用的函数和方法来进行字符串操作,这使得它更加简单和用户友好。带有字符指针的c样式“strings”很难控制、操作,并且经常会导致错误,但是没有std::string所具有的开销。通常,最好坚持使用std::string,因为它们更易于维护。

这两个字符串之间的唯一区别是,您应该注意:

POINTERS
--------

char const* s1 = "test";  // pointer to string literal - do not modify!

char* s1       = "test";  // pointer to string literal - do not modify!
                          //   (conversion to non-const deprecated in C++03 and
                          //       disallowed in C++11)

ARRAYS
------

char s1[5]     = "test";  // mutable character array copied from string literal
                          //    - do what you like with it!

char s1[]      = "test";  // as above, but with size deduced from initialisation



CLASS-TYPE OBJECTS
------------------

std::string s1 = "test";  // C++ string object with data copied from string
                          //    literal - almost always what you *really* want

您的项目已经在使用哪一个?

使用哪一个取决于您的需求。指针为您提供了更大的灵活性。在某些情况下,还存在易受攻击性。字符串是一个安全的选项,它们提供迭代器支持

使用
std::string
,除非您知道为什么需要一个字符数组/指向字符的指针。

这两种行为并不相同
s1
是一个简单的指针,它被初始化为指向内存的某个(通常为只读)区域<另一方面,code>s2定义大小为5的本地数组,并用该字符串的副本填充该数组

在形式上,您不允许修改
s1
,也就是说,执行类似
s1[0]=“a”
的操作。特别是,在奇怪的情况下,它可能会导致程序中的所有其他
“test”
变为
“aest”
,因为它们共享相同的内存。这就是现代编译器在编写代码时大喊大叫的原因

char* s = "test";
另一方面,允许修改
s2
,因为它是本地副本

换句话说,在下面的示例中

const char* s1 = "test";
const char* s2 = "test";
char s3[] = "test";
char s4[] = "test";
s1
s2
很可能指向内存中的同一地址,而
s3
s4
是同一字符串的两个不同副本,位于内存的不同区域


如果你写C++,除非你绝对需要一个字符数组,否则使用<代码> STD::String 。如果需要可修改的字符数组,请使用

char s[]
。如果您只需要一个不可变字符串,请使用
const char*

它们没有相同的行为:-)第一个只将指向常量字符串的指针放在堆栈中,第二个将整个可变字符串放在堆栈中。我经常看到人们使用const关键字,这有什么原因吗?如果没有const关键字,我会得到相同的行为,所以char*s1=“test”;。它工作正常,没有任何编译器错误。..@System.Data请参阅Lightness的答案。现在不推荐使用默认转换。这在国际海事组织是不应该被允许的,但事实确实如此。如果您试图修改它,它仍然是UB。@System.Data:这只是因为您在生成设置中没有使用足够的警告。在旧C中允许从代码> > const char */> >代码> > char */COD>字符串字符串(当它没有安全性<代码> const >)时,但逐渐被逐步淘汰出C++。因此,它在C++98/C++03中被弃用。。。在C++11中完全是非法的。这很危险,因为它使您能够在语法上修改字符串中的数据,而事实上它是常量数据。@System.data:作为一种更通用的协议,您应该始终使用
const
,除非您知道您不想。。。而不是相反。C++的名称默认为可变的而不是不可变的,这是一个设计向后兼容性的设计缺陷。这是有道理的,但它不是主要的因素。实际上,不幸的是,它通常是唯一的因素,因为您很少有机会去实现项目策略。是的,我对此有点不抱幻想。开发团队政治不在这个问题的范围之内,这是一个关于编程语言的问题。此外,如果你没有机会指导发展政策,那么你要么在一个非常大的团队中处于非常初级的地位,要么在一份糟糕的工作中。(或者两者兼而有之)我的意思是——一致性是代码库中最有价值的东西之一。不管个人对此有何看法,一致性甚至胜过常量正确性。字符串以何种方式“提供STL支持”?它们允许您使用STL函数,如搜索、asignment操作、acn测试等条件,如==、!=测试和比较与STL无关。C++标准库的算法是相关的,因为<代码> STD::String 有一个迭代接口。