在某处定义了空的std :: string吗?

时间:2015-09-11 17:33:06

标签: c++ string

在某处定义了空<script type="text/javascript"> $(document).ready(function () { $('textarea').each(function () { CKEDITOR.replace($(this).attr('id')); }); }); </script> 吗?

我的意思是:

我能做到:

std::string

但是,如果我这样做:

// code #1
int process(const char *s = nullptr);
// later I can use:
process();

它编译和工作,当我使用该函数时,不需要创建对象。

是否有标准方法可以执行以下操作:

// code #2
int process(const std::string &s = "");
// later I can use:
process(); // wait, an object is created...

这不是瓶颈,也不是过早的优化。

我认为C ++不是Java,所以正确的方法不是创建你不需要的对象。

另外我相信// code #3 const std::string EMPTY_STR; int process(const std::string &s = EMPTY_STR); // later I can use: process(); // fine, no object is created... 看起来比code 3好得多,并且它表明字符串为空(并且可能不会被使用)的意图,而不是code 2,其中不是很code 2明确字符串为""的原因。

2 个答案:

答案 0 :(得分:4)

没有(安全)制作参考的方式指的是什么。如果您根本不想创建对象,则必须使用指针;

int process(const std::string *s = nullptr);

如果要使用引用,则必须有某个对象。为此,您可以使用默认构造的(空)字符串作为默认参数;

int process(const std::string& s = std::string());

答案 1 :(得分:0)

首先,我有点惊讶你需要一个OBJECT。无论如何它将成为一个const对象,那么它给你什么简单的const char *呢?

其次,以通用方式解决您的问题。以下无所不在的代码存在真正的问题:

void foo(const std::string& data);

它允许将foo与std :: strings和const char *一起使用,几乎适合所有人。对于foo()的大多数用户来说无关紧要,但是对于真正修复了性能的人(如纳秒),从他们的const char *创建临时std :: string是一个痛点。为解决这个问题,发明了StringRef。它在std中不可用,但它在许多库中退出,包括boost,并且易于实现。这个想法如下:

class StringRef {
    ...
    StringRef(const std::string& str) : b(str.begin()), end(str.end()) {}
    StringRef(const char* str) : b(str), end(str + strlen(str)) {}
    ...
    private:
    const char* const b;
    const char* const e;
};

void foo(const StringRef str);