有没有办法在C ++中传递字符串文字作为引用

时间:2014-12-08 19:57:05

标签: c++ char pass-by-reference

在C ++中,如果值不能为NULL,则通常通过引用而不是指针传递。

假设我有一个带有以下签名的函数,它通常与字符串文字一起使用。

void setText( const char* text );

我想知道如何以接受引用的方式更改函数(并且具有不接受NULL的优点)?

  • 如果我将其更改为(const char& text),那么它将成为单个字符的引用。地址可以从函数中获取...但感觉不太好。

  • 另一个选项是(const std::string& text),它的缺点是它总是调用构造函数并进行一些动态内存分配。

还有其他常见方式,或只是坚持std::string&char*

2 个答案:

答案 0 :(得分:2)

老实说,我会保留const char* text函数并添加一个重载const std::string& text函数,该函数使用setText(text.c_str())

调用第一个函数

答案 1 :(得分:0)

这里有一个小问题,因为C ++和数组引用并不是最好的一对。有关参考,请参阅:C++ pass an array by reference

由于你正在谈论绑定对字符串的引用,而字符串是一个字符数组,我们正面碰到这个问题。鉴于此,我们真正做的最好的事情是将ref绑定到const char *,如下所示:

void ref(const char* const& s);

但这并不是你想要的;这会绑定对指针的引用,它所保证的只是指针本身存在,而不是它指向有效的字符串文字。 同样的问题出现在std :: string&例子:那些只保证你已经绑定到一个std :: string对象,但是那个字符串很可能是空的,所以你仍然没有保证自己是一个有任何有价值的字符串。 / p>

最后,我会说Zan所说的。 const char *是一个备受好评的成语传递字符串文字,然后有一个绑定到字符串的第二个重载是一个很好的方便。

(最后一点注意:std :: string不会' t"总是"分配内存。使用小字符串优化的实现将跳过长达23个字符的字符串。)