c++ - 按引用传递或按值传递指针容器之间的区别
问题描述
通常,在 C++ 中,我知道按值、按引用或指针解析之间的区别,但在传递容器时我很困惑。
我的问题是通过引用或值传递指针容器有什么区别。以及通过引用传递非指针容器和通过值传递指针容器有什么区别。
更具体地说,在下面的两个问题中,如果 'func()' 改变了 'myClass' 参数的值会发生什么:
有什么区别:
void func(list<myClass*> myList);
和
void func(list<myClass*> &myList);
有什么区别:
void func(list<myClass> &myList);
和
void func(list<myClass*> myList);
编辑:如果您希望调用函数的更改反映到原始对象,您有哪些选项,它们有什么区别?据我了解,您有以下选择:
void func(list<myClass*>& myList);
或者
void func(list<myClass>& myList);
解决方案
void func(list<*myClass> myList);
此调用复制参数并创建一个新列表。对该副本的任何修改都不会反映在调用参数上。
void func(list<*myClass>& myList);
此调用不会复制参数。对列表的任何修改都将反映到原始列表(因为它正在使用它),因为参数引用了这个列表。
void func(const list<*myClass>& myList);
一般来说,人们使用const list<*myClass>&
避免复制和禁止修改。
void func(list<myClass>* myList);
我认为这是您想问的问题,而不是list<*myClass>
. 所以这传递了一个指针而不是一个引用。这意味着myList
可能不存在,与必须引用现有对象的引用相反。它通常用于可选参数。
void func(list<myClass> myList);
显然,我错了,这是真正的比较。
这只是另一个对象,没有办法将 a 转换list<myClass>
为 a list<*myClass>
。myClass
如果指针列表是虚拟的,如果它们是在其他地方管理的,那么指针列表可能会很有趣。
所以这两个调用之间的区别基本上是你如何处理对象,或者按值,因为你希望对象本身在列表中(是的,你想通过引用传递它们)或者你只想要一个指针列表(但是你仍应通过引用或 const 引用传递它们,几乎从不通过值传递,除非您需要修改列表的副本)。
推荐阅读
- python - 逻辑回归获取值错误无法将字符串转换为浮点数:“?”
- c# - 百分比计算并从这些百分比输出图像 c# WPF
- python - Python:这个 datetime.strptime 解析有什么问题?
- ruby - 第一次尝试安装 ruby 时出现错误。我在 macOS High Sierra
- node.js - 远程方法,查询和循环关系数据
- python - Python 请求:能够登录然后访问受身份验证限制的页面,但不能 POST 到页面
- java - 什么是八进制到十六进制的测试用例会使以下程序失败?
- php - php中数组中一周的开始和结束日期
- machine-learning - 测试误差小于训练误差
- python - 尝试使用 BeautifulSoup 访问 XML 中的嵌套元素