向量,班级和破坏者
Vectors, Classes, and Destructors
这是我的班级
#include <iostream>
#include <vector>
class Base
{
public:
Base (int ind = 3)
:m_ind(ind)
{
std::cout<<"Base ()"<<std::endl;
}
virtual ~Base ()
{
std::cout<<"~Base ()"<<std::endl;
}
};
我在MAIN中尝试了此代码:
Base(6)//literal base
- 创建了一个"文字"基础,编译器打印
"Base ()"
- 由于它不是一个变量,因此,当编译器移出时,只有一些内存,它将删除分配给它的内存
- 编译器将打印
"~Base ()"
我尝试以主要运行此代码:
std::vector<Base>vec;
vec.push_back(Base(4));
我期望的是:
- 编译器创建
Base(4)
并将其存储在vec.at(0)
- 执行的构造函数和
"Base ()"
在屏幕上打印 - 当主函数末端
"~Base ()"
打印在屏幕上
我得到的:
- 编译器创建
Base(4)
并将其存储在vec.at(0)
- 执行的构造函数和
"Base ()"
在屏幕上打印 - 编译器移出并执行了DESTRUCTOR
"~Base ()"
已打印 - 主要功能末端和
"~Base ()"
打印
这意味着将Base(4)
删除时被删除,但是如果vec.at(0)
是基础(它在向量内部并且尚未删除),那么这是怎么可能的)
做
vec.push_back(Base(4));
您创建临时对象。此临时对象将传递给 copies 或将其移动到向量的push_back
函数(调用A 复制构造函数或移动构造函数在您的班上)。然后 push_back
函数返回,临时对象被破坏。
后来,当向量本身破坏时,向量内的副本将被破坏。
您省略了Base
的复制构造函数。尽管您没有写一个,但编译器为您提供了一个默认的。如果添加复制构造函数,您会看到它被调用(将临时Base(4)
复制到向量时):
#include <iostream>
#include <vector>
class Base
{
public:
Base(int)
{
std::cout<<"Base(int)"<<std::endl;
}
Base(const Base&)
{
std::cout<<"Base(Base)"<<std::endl;
}
virtual ~Base ()
{
std::cout<<"~Base()"<<std::endl;
}
};
int main()
{
std::vector<Base>vec;
vec.push_back(Base(4));
}
这会产生:
Base(int)
Base(Base)
~Base()
~Base()
如果您使用emplace_back
而不是push_back
,您会发现仅构建了一个实例。它没有复制:
int main()
{
std::vector<Base>vec;
vec.emplace_back(4);
}
Base(int)
~Base()
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量,班级和破坏者