写一个简单的类:
class CParentA
{
public:
CParentA() {}
public:
int parenta_a;
int parenta_b;
public:
virtual void parenta_f1() {this->parenta_a = 0x10;}
virtual void parenta_f2() {this->parenta_a = 0x20;}
public:
void parenta_f3() {this->parenta_a = 0x30;}
void parenta_f4() {this->parenta_a = 0x40;}
};
看看构造函数的汇编代码:
CParentA() {}
00401330 55 push ebp
00401331 8B EC mov ebp,esp
00401333 51 push ecx
00401334 89 4D FC mov dword ptr [ebp-4],ecx
00401337 8B 45 FC mov eax,dword ptr [this]
0040133A C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
00401340 8B 45 FC mov eax,dword ptr [this]
00401343 8B E5 mov esp,ebp
00401345 5D pop ebp
00401346 C3 ret
从这里发现了两行很有意思的代码:
00401337 8B 45 FC mov eax,dword ptr [this]
0040133A C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
我们知道在有vtbl的情况下,this指向的前四个字节用来存放vtbl的指针。原来在构造函数里还有一个工作是要设置vtbl的指针。难怪C++非要在里面插入一个构造函数。
删除我们自己写的构造函数,再构造一个CParentA的对象。
CParentA pa;
0040111E 8D 4D F0 lea ecx,[pa]
00401121 E8 39 FF FF FF call CParentA::CParentA (40105Fh)
还是要调用CParentA::CParentA,看看它做了什么:
CParentA::CParentA:
004013D0 55 push ebp
004013D1 8B EC mov ebp,esp
004013D3 51 push ecx
004013D4 89 4D FC mov dword ptr [ebp-4],ecx
004013D7 8B 45 FC mov eax,dword ptr [this]
004013DA C7 00 60 68 40 00 mov dword ptr [eax],offset CParentA::`vftable' (406860h)
004013E0 8B 45 FC mov eax,dword ptr [this]
004013E3 8B E5 mov esp,ebp
004013E5 5D pop ebp
004013E6 C3 ret
比较两个构造函数的汇编代码可以发现,它们并没有什么不同。
那么,假如一个类没有虚函数,也就没有vtbl,那么它是不是就不需要生成构造函数了呢?试试将CParentA里面的两个虚函数去掉:
CParentA pa;
可以发现,这行代码果然不再生成对构造函数的调用!
分享到:
相关推荐
关于“C++构造函数初始化列表 ”的实例分析
重载构造函数,调用成员函数,供C++初学者理解构造函数重载的概念
C++构造函数分类讲解,常见的构造函数都有讲解,虽然讲解的不是很详细但是能有利于新手的记忆。
C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数
这是课上用的quiz,c++语法,关于什么情况下会调用什么构造函数
C++构造函数,拷贝构造函数,虚函数,派生类
C++ 拷贝构造函数 赋值构造函数 解释
本程序包含构造函数和析构函数,可以把构造函数和析构函数的作用区分开
C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解
C++构造函数,复制构造函数和析构函数专题[1].pdf C++继承,虚函数与多态性专题.pdf
C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 理的状态。析构函数是在撤消对象时, 收回对象 ...
c++中关于构造函数与析构函数部分的课件,有助于初学者自学。
C++简单类的实现,包括构造函数,析构函数以及拷贝构造函数
问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...
这是我写的c++构找函数和实力的质料,很不错的,觉得很有用啊,呵呵!
C++构造函数详解及显式调用构造函数.doc
C++规定与类同名的函数就是拷贝构造函数 默认拷贝构造函数 在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 ...
此word文档主要讲解的是C++的构造函数和洗过后函数。配合几个例子,希望能给初学者一些帮助。
C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数