按引用传递或按值传递指针容器之间的区别

Posted

技术标签:

【中文标题】按引用传递或按值传递指针容器之间的区别【英文标题】:Difference between passing by reference or by value a container of pointers 【发布时间】:2018-12-04 11:08:26 【问题描述】:

通常,在 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); 

【问题讨论】:

假设&lt;*myClass&gt; 应该是&lt;myClass*&gt;。 1 复制指针列表 2. 传递对指针列表的引用,它通常比第一个便宜,但访问它可能比访问副本稍微贵一些。 3. 您通常想要的签名类型,通过引用传递对象列表(不复制) 4. 与 1 相同。 @George 抱歉,我问的是它们之间的区别,而不是口头声明.. 【参考方案1】:
void func(list<*myClass> myList);

此调用复制参数并创建一个新列表。对该副本的任何修改都不会反映在调用参数上。

void func(list<*myClass>& myList); 

此调用不会复制参数。对列表的任何修改都将反映到原始列表(因为它正在使用它),因为参数引用了这个列表。

void func(const list<*myClass>& myList);

一般来说,人们使用const list&lt;*myClass&gt;&amp;来避免复制并禁止修改。

void func(list<myClass>* myList);

我认为这是您想问的问题,而不是 list&lt;*myClass&gt;。所以这传递了一个指针而不是一个引用。这意味着myList 可能不存在,这与必须引用现有对象的引用相反。它通常用于可选参数。

void func(list<myClass> myList);

显然我弄错了,这才是真正的比较。

这只是另一个对象,无法将list&lt;myClass&gt; 转换为list&lt;*myClass&gt;。如果 myClass 是虚拟的,如果它们在其他地方进行管理,则指针列表可能会很有趣。

所以这两个调用之间的区别基本上是您如何处理对象,或者按值,因为您希望对象本身在列表中(是的,您希望通过引用传递它们)或者您只想要一个指针列表(但您仍应通过引用或 const 引用传递它们,几乎从不按值传递,除非您需要修改列表的副本)。

【讨论】:

第一次比较明白,谢谢。对于第二次比较,我的意思是我用指针写的,但我想我从你所做的第一次比较中理解了...... 更新了我的答案。 哈哈再次感谢你,但最后一个电话是“void func(list myList);” (作为第一个)。另外,我现在将再次编辑问题以添加一些内容。请检查一下。 第四个中没有星号,我的最后一段涵盖了您的编辑。这完全取决于你的记忆模型。

以上是关于按引用传递或按值传递指针容器之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

按值传递或按引用传递

java:按值传递或按引用传递[重复]

R按值传递或按引用传递[重复]

第7章 按值传递或按引用传递:7.5 处理返回值

按值传递指针和引用之间的区别?

第7章 按值传递或按引用传递:7.6 推荐的模板参数声明方法