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

标签 c++ pointers reference containers

通常,在 C++ 中,我知道按值解析、按引用解析或按指针解析之间的区别,但在传递容器时我感到困惑。

我的问题是,按引用传递或按值传递指针容器有什么区别。 还有通过引用传递非指针容器和通过值传递指针容器有什么区别。

更具体地说,在下面的两个问题中,如果“func()”更改了“myClass”参数的值会发生什么:

  1. 有什么区别:

    void func(list<myClass*> myList);
    

    void func(list<myClass*> &myList); 
    
  2. 有什么区别:

    void func(list<myClass> &myList);
    

    void func(list<myClass*> myList);
    

编辑: 如果你想让调用函数的变化反射(reflect)到原始对象上,你有哪些选择,它们有什么区别? 据我了解,您有以下选择: 要么

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

 void func(list<myClass>& myList); 

最佳答案

void func(list<*myClass> myList);

此调用复制参数并创建一个新列表。对该拷贝的任何修改都不会反射(reflect)在调用参数上。

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

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

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

一般来说,人们使用const list<*myClass>&避免复制和禁止修改。

void func(list<myClass>* myList);

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

void func(list<myClass> myList);

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

这只是另一个对象,无法转换 list<myClass>进入 list<*myClass> .如果myClass,指针列表可能会很有趣是虚拟的,如果它们在其他地方管理的话。

因此,这两个调用之间的区别基本上在于您处理对象的方式,要么按值处理,因为您希望对象本身在列表中(是的,您希望通过引用传递它们),要么只需要一个指针列表(但您仍然应该通过引用或 const 引用传递它们,几乎从不通过值传递它们,除非您需要列表的拷贝进行修改)。

关于c++ - 按引用传递或按值传递指针容器之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53611597/

相关文章:

c# - 将二维数组从 C# 传递到 C++

java - c++ 中的 clock() 时间与 java 中的 System.CurrentTimeMillis() 之间的时差

c - 使用自动更新的指针结构

c - C 中的外部指针和静态指针

Java返回对象/修改对象(编码指南)

c++ - 虚拟派生的多态类的大小

c++ - 是否有针对不同操作系统检查开源应用程序的构建农场?

asp.net-mvc - 错误: Could not load file or assembly 'Oracle.ManagedDataAccessDTC' or one of its dependencies

c++ - GTK+ 如何处理指针?

C++引用变量说明