注:在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以class来演示。
很多人觉得C++难学就是不知道编译器在我们的代码背后做了什么事情,这次我们通过汇编直接看看编译器如何改动我们代码。
一、构造函数的作用
当定义一个class时,系统会自动调用相应的构造函数,来完成class的初始化工作。如果没有给类定义构造函数,那么编译器将会自动创建一个构造函数。如果将其定义为非public类型,则该类只能通过其friend函数来创建。
二、如何使用构造函数
有如下class,分别讨论:
1)类成员函数为基本变量类型,不使用MIL
class Point2D
{
public:
Point2D(int _x, int _y)
{
x = _x;
y = _y;
}
private:
int x;
int y;
};
int _tmain(int argc, _TCHAR* argv[])
{
Point2D c2D(1,2);
return 0;
}
我们看看生成的汇编:
Point2D(int _x, int _y)
009E1F00 push ebp
009E1F01 mov ebp,esp
009E1F03 sub esp,0CCh
009E1F09 push ebx
009E1F0A push esi
009E1F0B push edi
009E1F0C push ecx
009E1F0D lea edi,[ebp-0CCh]
009E1F13 mov ecx,33h
009E1F18 mov eax,0CCCCCCCCh
009E1F1D rep stos dword ptr es:[edi]
009E1F1F pop ecx
009E1F20 mov dword ptr [ebp-8],ecx // 这之前都是进函数的一些处理,但是可以明确的是 没有对x,y赋值
{
x = _x;
009E1F23 mov eax,dword ptr [this] // 赋值
009E1F26 mov ecx,dword ptr [_x]
009E1F29 mov dword ptr [eax],ecx
y = _y;
009E1F2B mov eax,dword ptr [this]
009E1F2E mov ecx,dword ptr [_y]
009E1F31 mov dword ptr [eax+4],ecx
}
009E1F34 mov eax,dword ptr [this]
009E1F37 pop edi
009E1F38 pop esi
009E1F39 pop ebx
009E1F3A mov esp,ebp
009E1F3C pop ebp
009E1F3D ret 8
2)类成员函数为基本变量类型,使用MIL