动态分配,默认构造函数和虚拟表

时间:2014-04-18 20:52:41

标签: c++ constructor

我有一些问题。

  1. 如果我有一个A类,我通过以下方式创建一个实例:A* a = new A(); 我看到构造函数被调用了两次。 这没有意义。我是程序员只创建一次这个对象,因此我认为构造函数只会被调用一次,不是吗? A* a = new AA* = new A()之间有什么区别?

  2. 默认构造函数是什么?如果我在类A中有一个不带参数的构造函数,它是默认的构造函数吗?或者,如果我没有声明没有参数的构造函数,它是构造函数吗?

  3. 如果我有B级继承自A,并且A,B中有一个名为foo的函数。 如果foo是虚拟的并且foo不是虚拟的,那么虚拟表有什么区别?

2 个答案:

答案 0 :(得分:2)

1)我不知道你mean是什么,它只被叫一次。

2)是的,默认构造函数是不带参数的构造函数。如果你没有声明一个,编译器将生成一个,但它可能不是你想要的那个。

3)如果foo中的A是虚拟的,则动态绑定将适用。如果foo不是虚拟的,则不会。

A *a = new B();
a->foo(); //will call b::foo()

答案 1 :(得分:1)

  1. 构造函数应该只调用一次,发布代码以便可以看到发生了什么。 A* a = new AA* a = new A()之间没有区别。
  2. 默认构造函数是不带参数或具有所有默认参数的构造函数。如果你没有为你的类定义一个,那么编译器只会为提供一个,但是你还没有定义另一个带参数的构造函数。
  3. 如果foo未声明为虚拟,则不会有虚拟表格;编译器将在编译时在调用foo的位置插入实际的函数地址。如果它是虚拟的,则编译器会生成一些代码,以根据调用foo的对象类型在虚拟表中查找函数的地址。