C/C++ 函数中的引用、指针或值语义

Reference, pointer or value semantics in C/C++ functions

本文关键字:指针 语义 引用 C++ 函数      更新时间:2023-10-16

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

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;
}

我使用引用作为参数,使用值作为函数返回。是否有使用指针的偏好?在我的情况下,返回修剪字符串的副本。在某些函数中,返回常量引用。

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

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

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

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

在这里,由于您无论如何都要复制第一个参数,因此您不妨按值传递它:

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),以及需要可变副本时的对象类型。

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

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