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

问题描述

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()
为什么会调用三次拷备构造函数呢?

解决方案

给你看个例子你就知道怎么回事了,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两次,总共四次

时间: 2024-08-30 16:08:48

c++ 容器与继承-c++继承中拷备构造函数调用的疑问?的相关文章

java继承 在子类中声明同名变量的问题???

问题描述 java继承 在子类中声明同名变量的问题??? 如下代码: class Person { String name; int age; public void introduce(){ System.out.println("姓名是" + name + ",年龄是" + age); } } public class Students extends Person{ // String name; public static void main(String[

安卓-在继承intentservice的中如何调用finish()方法

问题描述 在继承intentservice的中如何调用finish()方法 在继承intentservice的中如何调用android.app.Activity的finish()方法

JavaScript中的继承之类继承_javascript技巧

继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多.在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可.在JS中想要达到继承公用成员的目的,需要采取一系列措施.JS属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承.在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的. 继承: function Animal(name){ this.name = na

新手,子包中的类怎么继承父包中的类?

问题描述 子类的父类可否是父包中的类.. 解决方案 解决方案二:类是随意继承的吧不区分包的吧解决方案三:头一次听说子包和父包的概念解决方案四:java里面没有包继承包这个概念在struts2的xml配置文件有包继承包的概念解决方案五:java里没有子包和父包这种概念,比如说com.aa和com.aa.bb这两个包就像郭芙和郭芙蓉一样,之间是没有任何关系,你不能说叫郭芙蓉的就是郭芙的女儿.包只是一个单纯的限定名.解决方案六:可以继承,继承的时候,在类的上方导入父类所在的那个包就可以了解决方案七:你

java se 多态 继承-继承和继承都可以添加新特性 ,那么继承和多态的区别在哪里?

问题描述 继承和继承都可以添加新特性 ,那么继承和多态的区别在哪里? 继承:我们封装了数据,形成数据类型后.假如我们想要使用相同的数据类型,这时候我们只需对原有的数据类型进行"克隆",再对其进行添加和修改. 多态:无论在创建过程中,还是需要加入新特性,它都可以方便的生长. 继承也可以加入新特性. 请问一下:该怎样区别继承和多态? 解决方案 继承是为了复用父类数据和方法,多态依赖于继承,是同样的方法表现不同的形态,两个的侧重都不是新特性的添加 解决方案二: 感觉是继承主要是子类继承父类,

java-Java在方法中可以任意构造类吗?

问题描述 Java在方法中可以任意构造类吗? protected void do_button_actionPerformed(final ActionEvent e) { new Thread() { // 开辟一个新的线程执行费时业务 public void run() { for (int i = 0; i < 10; i++) { // 循环添加10个列表选项 Runnable runnable = new Runnable() { // 创建Runnable对象 public void

对象-java中有关TreeSet的一个小疑问

问题描述 java中有关TreeSet的一个小疑问 看书上说java所有集合框架的具体类都至少有两种构造方式,一种是无参构造方法,一种是用另一个已有的容器来构造. 比如先前已经有了一个HashSet类的对象hh,但是他内部的元素是无序的,而我们这时再创建一个TreeSet(hh),他就会根据hh中存有元素自带的compareTo方法自动排好序,并且这个排序过程只进行一次.而如果我们将这些带排序的元素逐个加入到TreeSet中去,则就要加一次排一次序,会更耗时间. 请问,是不是有所遇到这种用到Tr

在Eclipse中构建备忘单

Eclipse提供了一种用于显示迷你型指南的内置机制,称为备忘单(cheat sheet).备忘单可以快速而有效地指导您如何在Eclipse中执行包含多个步骤的过程,它显示在工作台的边角处,您可以容易且快速地查看它们. 本教程演示了如何为Eclipse构造备忘单.构造完毕之后,它们还可以运行在BEA Workshop Studio.BEA Workshop for WebLogic和其他任何Eclipse系统之上,或许能对您现有的工具和插件进行补充.示例下载中提供了3个准备好的备忘单,其中一个备

stringbuffer-关于Java中FileInputStream类的一些新手疑问

问题描述 关于Java中FileInputStream类的一些新手疑问 在每次使用FileInputStream的read方法时,需要用到字节数组bytes和真实读取长度len,如代码: public static void read(){ File file = new File("D:/学习/Android/代码/Workplace/Java_8_1_File/a.txt"); try { //针对文件创建一个输入流 InputStream in = new FileInputSt