constructor和destructor概述(c++ only)

翻译 2009年10月28日 14:36:00

原文请参考
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中访问未初始化的对象。下面是一个例子:

<code=C/C++>
#include <iostream>
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;
}
</code>

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

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

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

相关文章推荐

C++_ConstructorAndDestructor

其实,在C++中,构造函数和析构函数并无其他的难处,在应用中只需要注意以下几点即可: 构造函数和析构函数: 构造函数引入:        在C++中,不能直接对数据成员在声明时就赋初值,必须在函...

C++ 析构函数

C++ 析构函数我使用的继承开发环境: Visual Studio 2010设计一个类时,如何写析构函数? 析构函数如果我们不写的话,C++ 会帮我们自动的合成一个,就是说:C++ 会自动的帮我们...

C 语言中的constructor与destructor

最近在看代码的时候碰到一个问题,这项目中有一个全局变量,里面有许多系统用的属性。但是一直找不到它在哪里被赋值。后来跟了代码才发现在系统开始之前已经有一个constructor将这个东西初始化好。  ...

C++构造函数与析构函数的解析

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。 注意,类的数据成员是不能在声明类时初始化的。如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如: ...

c++: 构造函数(constructor)与各种眼花缭乱的初始化(initialization)

本文是作为下一篇文章的前置。首发地址:http://blog.csdn.net/madongchunqiu/article/details/22325357 【注:灰色文字,不耐可略过。】 话说我...

c++:构造函数(constructor)和析构函数(destructor)中编译器的隐式行为(implicit behavior)

【注:心急的可以通过目录直接看每段的结论;更心急的可以直接跳到最后看总结。但是这样的看法估计和教材里学到的差不多】 上篇文章提到,c++为了保证向前的兼容性和新加入的各种花哨功能,引入了很多隐式行为...

C++ Copy Constructor (拷贝构造函数,复制构造函数)

1.什么是Copy Constructor? Copy Constructor 是一个特殊的构造函数,一般只有一个参数,这个参数一般是用const修饰的,对自己类的一个引用(reference)。...

c++:构造函数(constructor)和析构函数(destructor)中编译器的隐式行为(implicit behavior)

【注:心急的可以通过目录直接看每段的结论;更心急的可以直接跳到最后看总结。但是这样的看法估计和教材里学到的差不多】 上篇文章提到,c++为了保证向前的兼容性和新加入的各种花哨功能,引入了很多隐式行为...

C++之 iterator_traits

在算法中运用迭代器时,很可能会用到其相应型别,什么是相应型别?迭代器所指之物的型别便是其中之一。C++ 有函数模版推导机制,例如: template void  func_imp1(I iter, T...

constructor and destructor 概述

原文请参考 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc...
  • ICE_CHB
  • ICE_CHB
  • 2016年06月09日 23:49
  • 199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: constructor和destructor概述(c++ only)
举报原因:
原因补充:

(最多只允许输入30个字)