向量,类和析构函数

时间:2017-02-15 10:31:57

标签: c++ class vector

这是我的班级

#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
  • A&#34;字面意思&#34; base已创建,编译器将打印"Base ()"
  • 由于它不是变量,只是当编译器移出它时只有一些内存,它会删除分配给它的内存
  • 编译器将打印"~Base ()"

我尝试在main中运行此代码:

std::vector<Base>vec;
vec.push_back(Base(4));

我的期望是:

  • 编译器创建Base(4)并将其存储在vec.at(0)
  • 执行构造函数并在屏幕上打印"Base ()"
  • 当主要功能结束时"~Base ()"打印在屏幕上

我得到了什么:

  • 编译器创建Base(4)并将其存储在vec.at(0)
  • 执行构造函数并在屏幕上打印"Base ()"
  • 编译器移出并执行析构函数"~Base ()"打印
  • 主要功能结束并打印"~Base ()"

这意味着在向量中推送时会删除Base(4),但如果vec.at(0)为Base(它位于向量内并且已被删除),那怎么可能呢?

2 个答案:

答案 0 :(得分:3)

当你这样做时

vec.push_back(Base(4));

您创建了一个临时对象。此临时对象将传递给push_back函数,复制移动到函数中(调用复制构造函数在你的班级中移动构造函数。然后push_back函数返回并且临时对象被破坏。

稍后当矢量本身被破坏时,矢量内的副本将被破坏。

答案 1 :(得分:0)

您省略了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()