constructor和destructor概述(c++ only)

原文请参考
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr374.htm

constructor和destructor概述(c++ only)
对象的初始化和清除比简单的数据结构复杂的多,这是因为类有比较复杂的内部数据结构-包括数据和行为函数。Constructor和desctorctor是用来建立和销毁类对象的特殊的成员函数。Constructor可能调用内存申请并将对象初始化。Destruction可能调用销毁和释放对象的内存资源等。

同其他的成员函数一样,constructor和destructor在类内部声明,他们可以被定义成inline或者external。Constructors可以有默认参数,同其他成员函数不同,constroctor可有成员初始化列表。下面的限制条件适用于constructors和destructors:
*Constructor和Destructor不可以也不能返回任何值
*指针与引用不能用于constructor和destructor因为他们的地址不能得到
*Constroctor不能声明成virtual
*Constructor与destructor不能声明成static, const,或者是volatile
*Unions不能包含有constructor/destructor的类对象

constructor和destructor同其他成员函数一样遵守访问限制(private/public/protected)。比如,声明一个protected的constructor,那么只有子类和友元可以使用他来生成类对象。

定义类对象时,Compiler自动调用constructors,类对象生命周期结束,自动调用destructor。Constructor不为类对象的this指针申请内存,但是可能申请比对象所需要的内存多的存储空间。一旦需要对象需要内存,constructor可以准确的调用new操作符。析构时,destructor自动释放constructor所申请的资源。使用delete操作符释放对象。

子类不会继承或者重载基类constructor或者destructor,但是子类会调用基类的constructor和destructor。Destructor可以声明成virtual。

本地或者临时类对象建立时也会调用constructor,当走出作用域,destructor会被调用。

可以在constructor或者destructor中调用成员函数。比如在class A中也可以在constructor/destructor中直接/间接调用virtual函数。这种情形下,调用的函数是a中或者A的基类定义的,而不是A的子类中定义的。这样就防止了在constructor或者destructor中访问未初始化的对象。下面是一个例子:


#include
using namespace std;

class A {
public:
    virtual void f() { cout << "void A::f()" << endl; }
    virtual void g() { cout << "void A::g()" << endl; }
    virtual void h() { cout << "void A::h()" << endl; }
};

class B: public A {
public:
    virtual void f() { cout << "void B::f()" << endl; }
    B() {
        f();
        g();
        h();
    }
    ~B() {
        f();
        g();
        h();
    }
};

class C: public B {
public:
    virtual void f() { cout << "void C::f()" << endl; }
    virtual void g() { cout << "void C::g()" << endl; }
    virtual void h() { cout << "void C::h()" << endl; }
};

int main(int argc, char* argv[])
{
    c obj;

    return 0;
}


上面例子的输出是:
void B::f()
void A::g()
void A::h()

虽然建立的对象是C类的,但是B的constructor并没有调用C中重载B的函数。

可以在constructor/destructor中使用typeid或者dynamic_cast操作符。

你可能感兴趣的:(Track,of,concept)