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

时间:2018-12-04 11:08:27

标签: c++ pointers reference containers

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

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

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

  1. 之间有什么区别

    toJSON(tbl, pretty = TRUE)
    [
      {
        "X": 1,
        "i": "LON",
        "n": "London",
        "c": "United Kingdom",
        "C": "GB",
        "r": "Northern Europe",
        "F": 51.508,
        "L": -0.127,
        "b": 55.43,
        "s": 1.25,
        "q": 2088,
        "t": "0,0,1,3,1",
        "x": [
          {
            "d": "AAL",
            "p": 15
          },
          {
            "d": "AAR",
            "p": 15
          },
          {
            "d": "ABZ",
            "p": 48
          }
        ]
      }
    ] 
    

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

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

    void func(list<myClass> &myList);
    

编辑: 如果希望将调用函数的更改反映到原始对象,则您拥有哪些选项,它们之间有什么区别? 据我了解,您有以下选择:

void func(list<myClass*> myList);

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

1 个答案:

答案 0 :(得分:2)

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);

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

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

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