bicy 2014-08-22 09:00 采纳率: 100%
浏览 1855
已采纳

c++继承中拷备构造函数调用的疑问?

class Base
{
 public:
      Base()
      {
         cout << "Base()" << endl;
      }
      Base(const Base&)
      {
         cout << "Base(const Base&)" << endl;
      }
      ~Base()
      {
         cout << "~Base()" << endl;
      }
};

class Derived : public Base
{
 public:
      Derived()
      {
         cout << "Derived()" << endl;
      }
      Derived(const Derived&)
      {
         cout << "Derived(const Derived&)" << endl;
      }
      ~Derived()
      {
         cout << "~Derived()" << endl;
      }
};

int main(void)
{
    vector<Base> vec;
    Base obase;
    Derived oderived;
    vec.push_back(obase);
    vec.push_back(oderived);
    return 0;
}

结果:
Base()
Base()
Derived()
Base(const Base&)
Base(const Base&)
Base(const Base&)
~Base()
~Derived()
~Base()
~Base()
~Base()
~Base()
为什么会调用三次拷备构造函数呢?

  • 写回答

1条回答 默认 最新

  • glf007_r 2014-08-25 08:19
    关注

    给你看个例子你就知道怎么回事了,vector空间从1 到2 的时候,需要先释放再申请。

    vector push_back() (2012-02-20 17:10:53)转载▼
    标签: 杂谈 分类: c/cplusplus
    class Point
    {
    public:
    Point()
    {
    cout<<"construction!"< }
    Point(const Point &pt)
    {
    cout }
    ~Point()
    {
    cout }
    };
    int main()
    {
    std::vector pointVec;
    Point a; //执行构造函数一次
    Point b; //执行构造函数一次
    pointVec.push_back(a); //执行拷贝构造函数一次
    pointVec.push_back(b); //执行拷贝构造函数两次,析构函数一次。
    cout< system("pause");
    return 0; //返回后, 执行四次析构函数
    }
    1.vector的push_back()函数的动态增长过程是:0 -> 1 -> 2 -> 4 -> 8 -> 16 -> 32 ...
    2.push_back(a);//复制对象,从而会调用拷贝构造函数,空间为1.
    3.push_back(b);//空间不够,增加到2, 复制a,b到新空间(执行两次构造函数)。 然后释放原来a占的空间。所以这里执行一次析构函数
    4.main函数返回,执行四次析构函数。vector里面的a,b两次, main函数中的a,b两次,总共四次

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问