在C ++中,如果值不能为NULL,则通常通过引用而不是指针传递。
假设我有一个带有以下签名的函数,它通常与字符串文字一起使用。
void setText( const char* text );
我想知道如何以接受引用的方式更改函数(并且具有不接受NULL的优点)?
如果我将其更改为(const char& text)
,那么它将成为单个字符的引用。地址可以从函数中获取...但感觉不太好。
另一个选项是(const std::string& text)
,它的缺点是它总是调用构造函数并进行一些动态内存分配。
还有其他常见方式,或只是坚持std::string&
或char*
?
答案 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个字符的字符串。)