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操作符。

构造函数(Constructor)析构函数(Destructor)怎么用?

构造函数是创建类对象时必须要调用的函数,析构函数是当对象脱离作用域(eg:类的函数调用完毕)时必须要调用的函数。 即使不显式声明,系统也会创建一个缺省的构造函数和析构函数,它们只是保证程序可执行,并不...
  • u010218909
  • u010218909
  • 2016年01月22日 00:16
  • 477

C 语言中的constructor与destructor

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

C++ 析构函数

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

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

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

C++析构函数的定义和使用

析构函数(destructor)也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。 在C++中“~”是位取反运算符,从这点也可以想到:析构函数是与构造函数作用...
  • u010313877
  • u010313877
  • 2014年03月27日 17:54
  • 3989

C++ 析构函数以及 delete 和delete[]的整理

转自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的区别: C++告诉我们在回收...
  • qq_23363993
  • qq_23363993
  • 2016年08月15日 15:16
  • 1941

C++_ConstructorAndDestructor

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

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

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

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

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

通过实例分析C++中的析构函数

实例源代码heap_data_member.cpp /************************************* Critter Farm version: 1.0 --...
  • u010215456
  • u010215456
  • 2014年07月11日 20:03
  • 1054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: constructor和destructor概述(c++ only)
举报原因:
原因补充:

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