我最近遇到过这段代码,但不太明白发生了什么。
auto c = vector<int> {};
返回的向量构造函数是什么?
然后这段代码:
c = vector<int> {1,2,3,4,5 };
第二个c
与初始c
处于不同的内存位置吗?
重新初始化c
时是否调用了析构函数?
我搜索了互联网,但找不到上述代码的任何示例。
上述内容有何不同
vector<int> c {};
提前感谢您的帮助。
答案 0 :(得分:5)
&#34;正如jrd1所说,它是一个C ++ 11功能。
关键字auto
基本上意味着你让编译器&#34;猜测&#34;变量的类型。
所以c
是常规vector<int>
。
答案 1 :(得分:3)
返回的向量构造函数是什么?
空vector<int>
;并且编译器从该构造函数调用中推导出变量c
的类型,这意味着c
将获得类型vector<int>
。 auto
基本上只是让你免于输入两次变量类型 - 无论如何已经在构造函数调用中给出了它,你现在不必再次在变量名前面输入它,你可以使用{{ 1}}而不是。
第二个c是否位于与初始c不同的内存位置?
不,它是相同的载体;但来自另一个临时auto
(包含值1,2,3,4和5)的值会通过vector<int>
分配给c
。
这意味着,operator=
本身(c
)的地址不会改变。但是,它包含的数据(例如&c
的结果)可能也可能会改变。
重新初始化c时是否调用了析构函数?
不是c.data()
的析构函数。只有临时的一个。
答案 2 :(得分:2)
'first c'是定义变量c(int的向量)的地方。
auto c = vector<int> {};
'second c'只是重新赋值c。它不是一个新变量,因此c的内存地址不会改变,并且不会调用c的析构函数。
c = vector<int> {1,2,3,4,5 };
实际发生的是vector {1,2,3,4,5}创建了一个vector类型的临时对象,它从初始化列表中初始化,值为1,2,3,4,5。然后将此临时对象传递给c的复制构造函数(或在C ++ 11中)移动构造函数,以便c用临时对象中的值替换其当前值(如果有)。
c的析构函数在超出范围之前不会被调用(例如函数退出或定义它的控制块{}退出)。
答案 3 :(得分:1)
第一行和最后一行在功能上是等效的。
对于作业:
c = vector<int> {1,2,3,4,5 };
c不会被破坏或者之后被置于新的存储器操作中。
会发生的是,将使用5个值创建未命名的第二个向量,vector::operator=
将用于将该向量的内容分配给c。这将在C ++ 11中的移动操作方面发生。之后临时矢量将被销毁并且它的析构函数被调用,但不是c的析构函数。
答案 4 :(得分:1)
C ++ 11包含auto关键字,为您执行 Type Inference
它有助于简化代码。
例如:
auto itr = vec.iterator(); // instead of vector<int>::iterator itr