在C ++中,我们有值类型(int,long,float,...)和引用类型(class,struct,...)。
对于值类型,Array和Vector保存实际值;
对于引用类型,Array和Vector仅保存对这些对象的引用;
因此,当我们将引用类型放入Array和Vector时,我们需要确保这些对象存在足够长的时间(在整个过程中有效)以避免异常/错误;
我的上述陈述是否正确?如果我错了,请纠正我。
答案 0 :(得分:9)
没有。任何类型都可以通过值或引用传递(也可以在堆栈或堆上创建任何类型,尽管您没有问过)。
对于任何类型的数组和向量都保存实际值。因此,存储在向量中的任何类型都需要是可复制构造的。
见2.
不。如果您明确创建指针向量然后存储指向对象的指针,则情况就是这样。
答案 1 :(得分:2)
从您的角度来看,类也是值类型。如果您将类Apple的实例'a'放入向量< Apple>中,那么所谓的复制构造函数将用于创建将放入向量中的'a'副本。
答案 2 :(得分:0)
我认为你的意思是纯数据类型和派生数据类型。值/参考是指大多数时间通过值/按参考值传递
数组/向量/集合始终包含值
引用不能直接存储在数组/集合中,你必须包装引用。
我认为你的意思是指针。
答案 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)
我们有C ++类型,而不是值和引用类型。任何类型的值都可以直接在堆栈或堆上分配,并且最终可以通过指针或引用来引用。
数组和向量包含数据对象。这些可以是您感兴趣的对象,也可以是某种类型的指针。 (在C ++中,指向类型的指针本身就是一种类型。)
见2.
这就是智能指针的用途。 Boost shared_ptr<>
将删除它不再可访问时指向的内容,是一个小规模的引用计数垃圾收集器。