c++支持程序员自己写出将创建或销毁一个对象时,使用的方法,也就是构造器与析构器。1.基类和子类构造函数的调用在没有继承机制的情况下,这些方法在创建或销毁一个对象的时候被调用,比较容易理解,但加入了继承机制,构造器和析构器变得有点复杂。比如基类为Animal(), 子类为Pig。基类有个构造器,子类也有构造器,当子类的对象,即 Pig类的对象在被创建时,将第一步调用基类Animal 的构造器,第二步调用子类Pig的构造器。2.当构造器带着输入参数的情况,例如
class Animal
{
public:
Animal(std::string theName)
std::string name;
};
class pig: public Animal{
public:
Pig(std::string theName);
};
方法的定义方法:
Animal::Animal(std::string theName){
name = theName;
}
Pig::Pig(std::string thePigName) : Animal(thePigNmae){
}
其中,“:Animal(theName)”语法的含义:
— 当调用Pig()构造器时(以theName 作为输入参数), Animal() 构造器也将会被调用,同时 theName 的输入参数将传递给它。
— 当调用 Pig pig (”小猪“); 将把字符串 ”小猪“ 传递给pig() 和 Animal() , 赋值动作实际发生在Animal() 方法里。
3. 当销毁某个对象时,基类的析构器也会被自动调用,但这些事编译器会自动替你处理。因为析构器不需要输入参数,所以根本用不着使用
:SuperClassMethod(arguments) 语法。
与构造器相反,基类的析构器 将在子类的最后一条语句执行完毕后才被调用。
执行顺序:
基类构造器 — > 子类构造器 —> 子类析构器 —> 基类析构器
例子:
#include <iostream>
#include <string>
class BaseClass
{
public:
BaseClass();
~BaseClass();
void doSomething();
};
class SubClass : public BaseClass
{
public:
SubClass();
~SubClass();
};
BaseClass::BaseClass()
{
std::cout <<"进入基类构造器\n" ;
std::cout <<"我在基类构造器里做了某些事 \n";
}
BaseClass::~BaseClass()
{
std::cout << "进入基类析构器 \n";
std::cout << "我在基类析构器里做了某些事 \n";
}
void BaseClass::doSomething()
{
std::cout << "我做了某些事" << std::endl;
}
SubClass::SubClass()
{
std::cout << "进入子类构造器\n";
std::cout << "我在子类构造器里做了某些事" << std::endl;
}
SubClass::~SubClass()
{
std::cout << "进入子类析构器 " << std::endl;
std::cout << "我在子类析构器里做了某些事" << std::endl;
}
int main()
{
SubClass subclass;
subclass.doSomething();
std::cout << "All have been down" << std::endl;
return 0;
}