完全掌握C++编程中构造函数使用的超级学习教程

2020-01-06 14:26:49王冬梅

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 将产生以下事件序列: