C++ 什么时候通过值传递 const 结构参数与通过引用传递 const 结构参数有意义?

Dav*_*eUK 4 c++ parameters reference constants

我见过类似的问题,但我想澄清一下......

假设一个基本的 C++ 类:

class MyClass
{
public:
    struct SomeData
    {
        std::wstring name;
        std::vector<int> someValues;
    };

    void DoSomething(const SomeData data);
}
Run Code Online (Sandbox Code Playgroud)

我知道这data将被传递constDoSomething并且这是可以的,因为data函数不会以任何方式修改...但我习惯于看到参数&指定const以确保它们通过引用传递,例如

void DoSomething(const SomeData& data);
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎更有效率。如果我们省略&,那么不是data按值传递给DoSomething?我不确定为什么当const您可以通过引用传递并避免复制发生时,最好按值传递参数?

Pra*_*Anj 7

按值/引用传递和常量正确性是两个不同的概念。但一起使用。

按值传递

 void DoSomething (SomeData data);
Run Code Online (Sandbox Code Playgroud)

当复制成本较低并且不想保留对外来对象的引用时,可以使用按值传递。在某些情况下,该函数可以(如果它在类内部)保留指向 this 的指针并拥有自己的副本。

通过引用传递

void DoSomething (SomeData& data);
Run Code Online (Sandbox Code Playgroud)

如果您知道这可能会导致复制结构的性能损失,请始终使用引用传递。在某些情况下,该函数可以(如果它在类内部)保留指向 this 的指针并指向外部对象。保留指向外来对象的指针意味着您应该了解其生命周期以及该外来对象何时超出范围。更重要的是,异物的变化会出现在您的指针上。

常量正确性

void DoSomething (const SomeData data);  // const for local copy
void DoSomething (const SomeData& data); //  const for callers object
Run Code Online (Sandbox Code Playgroud)

添加const按值或引用传递意味着该函数不会更改它。但不拥有或拥有&决定了您要尝试增加修改安全性的对象。const在记录 API 方面,C++ 中是一个非常有用的工具,提供编译时安全性,允许更多编译器优化。

阅读这篇文章。