C ++数组和向量是保持值还是引用?

时间:2010-02-17 20:48:53

标签: c++

  1. 在C ++中,我们有值类型(int,long,float,...)和引用类型(class,struct,...)。

  2. 对于值类型,Array和Vector保存实际值;

  3. 对于引用类型,Array和Vector仅保存对这些对象的引用;

  4. 因此,当我们将引用类型放入Array和Vector时,我们需要确保这些对象存在足够长的时间(在整个过程中有效)以避免异常/错误;

  5. 我的上述陈述是否正确?如果我错了,请纠正我。

7 个答案:

答案 0 :(得分:9)

  1. 没有。任何类型都可以通过值或引用传递(也可以在堆栈或堆上创建任何类型,尽管您没有问过)。

  2. 对于任何类型的数组和向量都保存实际值。因此,存储在向量中的任何类型都需要是可复制构造的。

  3. 见2.

  4. 不。如果您明确创建指针向量然后存储指向对象的指针,则情况就是这样。

答案 1 :(得分:2)

从您的角度来看,类也是值类型。如果您将类Apple的实例'a'放入向量< Apple>中,那么所谓的复制构造函数将用于创建将放入向量中的'a'副本。

答案 2 :(得分:0)

  1. 我认为你的意思是纯数据类型和派生数据类型。值/参考是指大多数时间通过值/按参考值传递

  2. 数组/向量/集合始终包含值

  3. 引用不能直接存储在数组/集合中,你必须包装引用。

  4. 我认为你的意思是指针。

答案 3 :(得分:0)

请记住,如果使用指向对象的指针填充向量,则您有责任自行删除这些对象。如果向量是这些指针保留的唯一位置,则在向量被销毁时会泄漏内存,除非您在向量中的每个指针上调用delete。

如果用实际对象(而不是指针)填充向量,则在将对象插入向量时会生成对象的副本。在这种情况下,您不必担心自己删除对象;当矢量被销毁时,它们会自动删除。

答案 4 :(得分:0)

是的,但有两点需要注意。 “引用”这个词是C ++的术语,我认为你的意思是“指针”。您不能将引用(&)放在数组中,但可以将指针(*)放入数组中。

第二,可以创建一个包含结构/类的数组,而不是指向它们。

struct _foo {
  ...
  }; 

struct _foo ary[3]; // an array of 3 foos, the foos are _in_ the array, no rule 4

struct * _foo ary[3]; // an array of 3 pointers to foo, rule 4 applies

答案 5 :(得分:0)

您似乎来自Java或C#背景。在C ++中,默认情况下一切都是值类型,如果您特别指定,它只是一个引用类型。默认情况下,所有标准容器和大多数库容器都存储值。

演示值类型和引用类型的示例:

int a; // a is of a value type
int& b = a; // b is of a reference type, modifying b will modify a.

MyClass c; // c is of a value type
MyClass& d = c; // d is of a reference type, modifying d will modify c.

答案 6 :(得分:0)

  1. 我们有C ++类型,而不是值和引用类型。任何类型的值都可以直接在堆栈或堆上分配,并且最终可以通过指针或引用来引用。

  2. 数组和向量包含数据对象。这些可以是您感兴趣的对象,也可以是某种类型的指针。 (在C ++中,指向类型的指针本身就是一种类型。)

  3. 见2.

  4. 这就是智能指针的用途。 Boost shared_ptr<>将删除它不再可访问时指向的内容,是一个小规模的引用计数垃圾收集器。