stdcall 调用约定用于使用 __stdcall 关键字声明的静态成员函数和全局函数,且不使用变量参数列表。对非静态成员函数(如构造函数)使用 __stdcall 关键字时,编译器将使用 thiscall 调用约定。
基类的构造函数不由派生类继承。创建派生类类型的对象时,该对象将从基类组件开始进行构造;然后移到派生类组件。由于整个对象有一部分已初始化,因此编译器使用每个基类的构造函数(虚拟派生的情况除外,如初始化基类中所述)。
显式调用构造函数
可以在程序中显式调用构造函数来创建给定类型的对象。例如,若要创建描述某行末尾的两个 Point 对象,请编写以下代码:
DrawLine( Point( 13, 22 ), Point( 87, 91 ) );
创建类型 Point 的两个对象,将其传递给函数 DrawLine,并在表达式(函数调用)的末尾将其销毁。
在其中显式调用构造函数的另一个上下文正在进行初始化:
Point pt = Point( 7, 11 );
使用接受类型为 Point 的两个参数的构造函数来创建和初始化类型为 int 的对象。
通过显式调用构造函数创建的对象(如上面的两个示例)未进行命名,并且该对象具有在其中创建它们的表达式的生存期。 临时对象中更详细地讨论了这一点。
通常,从构造函数的内部调用所有成员函数是安全的,因为该对象在用户代码的第一行执行之前已完全设置(已初始化虚拟表等)。但是,在构造或析构期间,成员函数调用抽象基类的虚拟成员函数可能是不安全的。
构造函数可以调用虚函数。调用虚函数时,调用的函数将是为构造函数自己的类定义的函数(或从其基类继承)。以下示例演示从构造函数的内部调用虚函数时发生的情况:
// specl_calling_virtual_functions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Base
{
public:
Base(); // Default constructor.
virtual void f(); // Virtual member function.
};
Base::Base()
{
cout << "Constructing Base sub-objectn";
f(); // Call virtual member function
} // from inside constructor.
void Base::f()
{
cout << "Called Base::f()n";
}
class Derived : public Base
{
public:
Derived(); // Default constructor.
void f(); // Implementation of virtual
}; // function f for this class.
Derived::Derived()
{
cout << "Constructing Derived objectn";
}
void Derived::f()
{
cout << "Called Derived::f()n";
}
int main()
{
Derived d;
}
在运行前面的程序时,声明 Derived d 将产生以下事件序列:










