1

我有简单的代码来修剪字符串

std::string TrimEnd(const std::string& str, const std::string& chars)
{
    std::string trimmed = str;
    int index = 0;
    if((index = trimmed.find_last_not_of(chars)) < trimmed.length() - 1)
            trimmed.erase(index + 1);
    return trimmed;
}

我使用参数引用和函数返回值。有没有偏好使用指针来代替?在我的情况下,将返回修剪后的字符串的副本。在某些函数中,会返回 const 引用。

4

4 回答 4

2

不,不是一般意义上的。如果您需要能够传入一个 NULL 化的指针,或者需要对参数进行一些指针运算,请传递一个指针。否则,默认传递引用。

于 2012-11-16T17:46:24.987 回答
2

对于 C++ 风格,您按值返回。通过引用/常量引用传递。( POD 的值) 永远不会通过引用返回,除非它引用静态存储,或者如果您想公开对它们的访问权限(通常 const & 将用于此).. 是的,按值返回会生成另一个副本,但是较旧的 c++ 标准允许编译器对其进行优化。并且新的 c++ 11 标准允许移动构造函数更棒。

于 2012-11-16T17:48:57.370 回答
1

如果您返回一个新字符串,则没有理由通过引用传递,并且您当然不想返回对的引用,trimmed因为它的作用域就是TrimEnd方法。

除非您尝试优化代码,否则我会按值传递。如果您正在编写自己的字符串类(或类似的东西)并且性能是您的首要任务,那么我会通过参考来做所有事情。

于 2012-11-16T17:49:42.700 回答
0

在这里,由于无论如何您都在制作第一个参数的副本,您不妨按值传递它:

std::string TrimEnd(std::string str, const std::string& chars)
{
    int index = 0;
    if((index = str.find_last_not_of(chars)) < str.length() - 1)
        str.erase(index + 1);
    return str;
}

一般来说:

  • 通过const引用传递对象类型。

  • 当您需要可变副本时,按值传递原语(例如,int)以及对象类型。

  • 当指针可能为空时,通过指针传递参数。

  • 按值或智能指针返回(例如,unique_ptr);原始指针的所有权不明确。

于 2012-11-16T17:52:43.910 回答