C字符串声明

我从一开始就学习C,我没有得到整个字符串的主题。

以下三个代码有什么区别?

> std :: string s = std :: string(“foo”);
> std :: string s = new std :: string(“foo”);
> std :: string s =“foo”;

最佳答案
std::string s = std::string("foo");

这将创建一个包含“foo”的临时std :: string对象,然后将其分配给s。 (请注意,编译器可能会临时删除,这种情况下的临时elison明确允许C标准。)

std::string s = new std::string("foo");

这是一个编译错误。表达式new std :: string(“foo”)在空闲存储上创建一个std :: string,并返回一个指向std :: string的指针。然后尝试将类型为std :: string *的返回指针分配给类型为std :: string的s。 std :: string类的设计防止发生这种情况,因此编译失败。

C不是Java这不是通常创建对象的方式,因为如果您忘记删除返回的std :: string对象,则会泄漏内存。使用std :: string的主要优点之一是它自动管理底层的字符串缓冲区,所以新建它的目的就是失败。

std::string s = "foo";

这与#1基本相同。它在技术上初始化一个新的临时字符串,它将包含“foo”,然后将其分配给s。再次,编译器通常会消除临时的(实际上几乎所有非愚蠢的编译器实际上都消除了临时的编译器),所以在实践中它只是构造一个名为s的新对象。

具体来说,它调用一个接受const char *参数的std :: string中的转换构造函数。在上面的代码中,转换构造函数需要是非显式的,否则就是一个编译错误。转换构造函数实际上对于std :: strings是非显式的,所以上面的代码编译。

这是std :: string通常被初始化的方式。当s超出范围时,s对象将与底层字符串缓冲区一起销毁。请注意,以下内容具有相同的效果(并且是std :: strings初始化的另一种典型方式),因为它也产生一个名为s的包含“foo”的对象。

std::string s("foo");

然而,there’s a subtle difference between std::string s = "foo"; and std::string s("foo");中,其中之一是在上述情况下,转换构造函数可以是显式的或非显式的。

转载注明原文:C字符串声明 - 代码日志