首页 > 解决方案 > C++ 什么时候通过值与引用传递 const 结构参数才有意义?

问题描述

我已经看到了与此类似的问题,但我想澄清一下...

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

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

    void DoSomething(const SomeData data);
}

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

void DoSomething(const SomeData& data);

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

标签: c++parametersreferenceconstants

解决方案


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

按值传递

 void DoSomething (SomeData data);

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

通过引用传递

void DoSomething (SomeData& data);

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

常量正确性

void DoSomething (const SomeData data);  // const for local copy
void DoSomething (const SomeData& data); //  const for callers object

添加const按值或引用传递意味着此函数不会更改它。但是没有或没有&决定您要尝试添加修改的安全性的对象。const就文档 API 而言,它是 C++ 中非常有用的工具,提供编译时安全性,允许更多编译器优化。

阅读这篇文章。


推荐阅读