c++ - C++ 什么时候通过值与引用传递 const 结构参数才有意义?
问题描述
我已经看到了与此类似的问题,但我想澄清一下...
假设一个基本的 C++ 类:
class MyClass
{
public:
struct SomeData
{
std::wstring name;
std::vector<int> someValues;
};
void DoSomething(const SomeData data);
}
我知道这data
将被传递const
,DoSomething
这没关系,因为data
函数不会以任何方式修改......但我习惯于看到&
用const
参数指定以确保它们通过引用传递,例如
void DoSomething(const SomeData& data);
这对我来说似乎更有效率。如果我们省略&
, 那么不是data
按值传递给DoSomething
? const
我不确定当您可以通过引用传递并避免发生复制时,为什么最好按值传递参数?
解决方案
按值/引用传递和常量正确性是两个不同的概念。而是一起使用。
按值传递
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++ 中非常有用的工具,提供编译时安全性,允许更多编译器优化。
阅读这篇文章。
推荐阅读
- matlab - 在 3D 网格上找到对应于最慢增加方向的标量函数的值
- .net - 在我调整父窗体的大小之前,WebBrowser 控件不会绘制
- npm - 如何重新安装 NODE/NPM
- android - 从可绘制资源中获取位图,Android
- sql-server - 如何使用 .env 文件修复 sqlalchemy create_engine 的字符串格式?
- java - 检查子序列时循环后重复条件
- azure - Azure Pipelines 在部署槽中失败
- javascript - 由于 javascript 问题,Wkhtmltopdf 渲染错误
- python - How to download from the XML url using python
- android - Android - 从 LiveData 观察者更新 TextView 时 NestedScrollView 跳转