happem

为什么需要构造函数和析构函数

 

编译器无法预期一个程序在执行过程中会在何时创建一些什么对象,而只能根据当时的上下文要求创建,对象的初始化最好能够通过运行时执行一个函数来完成,而且是在对象创建的同时,这个函数就是构造函数,同样,对象在完成其使命的时候能够通过一个函数来销毁,这就是析构函数。

当给一个对象分配好原始内存空间的时候,这个对象就应该算创建起来了。只不过它还处于一种“原始状态”,即末初始化的,不良的状态,如果把这样的内存直接拿来使用,除非第一个操作是赋值,否则极有可能出错。例如:

   Long long1;         //局部变量

   Count<

   Char*pstr=(char*)malloc(1024);

   Cout<

因此,创建一个变量或动态对象时一定不要忘记初始化。 初始化就是在对象创建的同时使用初值直接填充对象的内存单元,因此,不会有数据类型转换等中间过程,也就不会产生临时对象,而赋值则是在对象创建好后任何时候都可以调用的而且可以多次调用的函数,由于它调用的是“=”运算符,因此可能需要进行类型转换,即会产生临时对象。

C++对象可以使用构造函数来初始化,构造函数是任何对象创建时自动调用的第一个成员函数,也是为每个对象仅调用一次的成员函数,所以构造函数的作用就是:当对象的内存分配好后把它原始状态变成良好的可用的状态。

有的程序员可能认为:虽然我没有在构造函数中初始化数据成员,但是我在声明一个对象后马上调用它的set-XXX()函数来初始化它的每一个成员,效果也是一样的。

最好为每个类显式地定义构造函数和析构函数,即使它们暂时空着,尤其是当类含有指针成员或引用成员的时候。

构造函数的另一重要用途就是给一些可能可能存在的隐含成员如vptr创造一个初始化的机会,否则虚拟机将不能保证实现,每当此时,如果程序员没有为一个多态类显式地定义默认构造函数、拷贝构造函数、析构函数或拷贝赋值函数,那么编译器会自动得生成相应的函数,它们都是public inline的,并在其中插入正确初始化或修改vptr数据成员值的代码,而且确保基类对象和派生类对象构造时及在它们之间拷贝时vptr能够指向或重新指向恰当的vtable,这样的4个函数分布叫非平凡默认构造函数、非平凡拷贝构造函数、非平凡析构函数和非平凡拷贝赋值函数。www.lirenedu.org

posted on 2012-09-03 10:56 happem 阅读(628) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理