声明成员变量中的字符串与 C 字符串

Posted

技术标签:

【中文标题】声明成员变量中的字符串与 C 字符串【英文标题】:String vs C-string in declaring a member variable 【发布时间】:2013-12-01 18:13:54 【问题描述】:

我在一个返回字符串的类中有一个成员函数。 如果我想将返回值设为 C 字符串类型,我需要在声明中做什么?修改后的函数可能有也可能没有 C 字符串参数(可以保留当前参数)。

原来的声明是:

string function(string argument);

【问题讨论】:

Google“C 字符串处理”,有很多有用的结果。 保持函数不变,在需要访问 C 风格字符串的任何地方使用 c_str() 成员函数。 将它作为参考传递——也许是一个常量。节省复制操作符 【参考方案1】:

C 风格的字符串是 char 数组,以 \0 封闭,所以:

char* function(string argument);

您也可以考虑通过 c_str() 方法返回一个字符串并从该值中检索一个 C 字符串。

【讨论】:

【参考方案2】:

C 字符串只是指向字符串第一个字符的美化指针,用 0 字节标记字符串的结尾。所以,你返回一个 char 指针:

char *function(string argument); // returns pointer to modifiable char buffer

困难的部分是,字符串必须仍然存在于某个地方。例如,您不能返回局部变量的地址,因为它会在函数返回时消失。低级别的方法是,您返回一个从堆分配的指针,使用new char[length+1] 并期望调用者在完成后将它指向delete[]。但这很容易导致内存泄漏和所有其他有趣的手动内存管理。

更简单的是返回某种包装对象,例如智能指针。但是,到目前为止,最简单且最不容易出错的方法是使用 std::string 作为包装对象,并使用其 c_str() 方法访问 C 字符串...


在一种情况下,返回 C 字符串可能是有意义的:您从一组文字中返回一个字符串文字,就像这个粗略的例子:

return (result>0 ? "positive" : "not positive");

在这种情况下,返回指向 const char 的指针,因为文字是只读的,并且不要将它与返回堆中生成的字符串之类的东西混在一起(因为谁会删除它?)。

const char *function(string argument); //returns pointer to string literal

【讨论】:

【参考方案3】:

我会通过以下方式声明函数

char* function( const std::string &s );

【讨论】:

【参考方案4】:

cstring 标头提供了处理 C 风格字符串的函数 — 以 null 结尾的字符数组。

#include <cstring>
string function(std::string argument);

【讨论】:

以上是关于声明成员变量中的字符串与 C 字符串的主要内容,如果未能解决你的问题,请参考以下文章

c++中静态成员变量和静态成员函数(笔试经历)

成员变量与局部变量的区别

C++_类中静态成员

C++_类中静态成员

C++_类中静态成员

类与对象