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

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

这是输出:


ConstructorDestructor constructor with 1 int.
ConstructorDestructor constructor with 2 ints.
ConstructorDestructor constructor with 3 ints.

所有构造函数完成后,完全初始化的构造函数将立即创建对象。 DerivedContainer(int int1) 成功,但是 DerivedContainer(int int1, int int2) 失败,并调用析构函数。


class ConstructorDestructor {
public:
  ConstructorDestructor() {
    cout << "ConstructorDestructor default constructor." << endl;
  }
  ConstructorDestructor(int int1) {
    cout << "ConstructorDestructor constructor with 1 int." << endl;
  }
  ConstructorDestructor(int int1, int int2) : ConstructorDestructor(int1) {
    cout << "ConstructorDestructor constructor with 2 ints." << endl;
    throw exception();
  }
  ConstructorDestructor(int int1, int int2, int int3) : ConstructorDestructor(int1, int2) {
    cout << "ConstructorDestructor constructor with 3 ints." << endl;
  }

  ~ConstructorDestructor() {
    cout << "ConstructorDestructor destructor." << endl;
  }
};

int main() {

  try {
    ConstructorDestructor cd{ 1, 2, 3 };
  }
  catch (const exception& ex){
  }
}

输出:


ConstructorDestructor constructor with 1 int.
ConstructorDestructor constructor with 2 ints.
ConstructorDestructor destructor.

继承构造函数 (C++11)
派生类可以使用 using 声明从直接基类继承构造函数,如下面的示例所示:


#include <iostream>
using namespace std;

class Base
{
public:  
  Base() { cout << "Base()" << endl; }
  Base(const Base& other) { cout << "Base(Base&)" << endl; }
  explicit Base(int i) : num(i) { cout << "Base(int)" << endl; }
  explicit Base(char c) : letter(c) { cout << "Base(char)" << endl; }

private:
  int num;
  char letter;
};

class Derived : Base
{
public:
  // Inherit all constructors from Base
  using Base::Base;

private:
  // Can't initialize newMember from Base constructors.
  int newMember{ 0 };
};


int main(int argc, char argv[])
{
  cout << "Derived d1(5) calls: "; 
  Derived d1(5);
  cout << "Derived d1('c') calls: ";
  Derived d2('c');
  cout << "Derived d3 = d2 calls: " ;
  Derived d3 = d2;
  cout << "Derived d4 calls: ";
  Derived d4; 

  // Keep console open in debug mode:
  cout << endl << "Press Enter to exit.";
  char in[1];
  cin.getline(in, 1);
  return 0;
}

输出:

Derived d1(5) calls: Base(int)
Derived d1('c') calls: Base(char)
Derived d3 = d2 calls: Base(Base&)
Derived d4 calls: Base()
Press Enter to exit.