初始化和清除~~~从构造和析构说起

来源:互联网 发布:淘宝生活用品 编辑:程序博客网 时间:2024/05/22 06:58



To be or not to be  that is the question

                                                            ——The Tragedy of Hamlet,Prince of Denmark

 

 

     构造函数和析构函数正如《哈姆雷特》那句经典的台词一样 to be or not ,这句话也十分经典的引出了我的开篇


构造函数:确保初始化 to be

     顾名思义即为了构造而产生,目的是为了初始化对象,constructor,是如此的重要以至于不

能把它留给客户程序员来做。而构造函数是由编译器调用的,当客户程序员调用时这个对象已经初始化过了。而它的名字正是和类的名字一致(c++之父Stroustrup的方法)这真是方便因为避免了与类中其它成员函数的冲突。

    传递到构造函数的第一个参数是this指针,这就调用了这一函数的对象地址,然而this 指针只是分配了这块内存,没有初始化,constructor就做了这项工作。

 

 

特点:

          1.名字与类名一致,并且由编译器调用,

       2.只要创建对象一定会调用到并且是由编译器隐式的调用

       3.没有函数返回值类型,但可以有参数,并且可以有多个

对于特点的分析:

         对于特点3 决定了构造函数可以被重载

                      实参决定了使用哪个构造函数

                      一般都采用默认的实参来写构造函数(这是因为它减少代码的重复性)

         对于特点1 构造函数是自动执行的

         ps:把构造函数声明为const成员函数是不必要的。因为是初始化嘛 ,当然就一样对待的。

构造函数的初始化方法:

       1.初始化列表:这种方法非常的棒可以告诉编译器我是在调用本构造函数之前就进行初始化,

对于数据成员是类类型的必须放在初始化列表中,还有就是const数据成员也必须在哪里进行初始化。这点在继承中也深有运用。初始化的顺序就是数据成员的定义顺序(但这是无关紧要的)

       2.数据成员在函数内部进行初始化。(这个就不需多讲啦)


默认构造函数

default constructor 就是不带任何参数的构造函数 但是如果程序员不自己写 由于它没有参数所以为对行啊分配的都是些随机的数。

一个类哪怕只定义了一个构造函数编译器也不会为它生成默认构造函数,这是因为:如果一个类在某种情况下需要控制对象的初始化,则该类可能在所有的情况下都需要控制。



合成默认构造函数

synthesized default constructor:具有类类型的成员运行各自的默认构造函数来初始化,内置和复合类型的成员,如指针和数组,只对定义的全局作用域中的对象才初始化,对于定义在局部的对象不进行初始化。

 

类通常定义一个默认构造函数:这是因为很多的好处

其中之一就是:在默认构造函数中为成员提供的初始化值的对象总是空!

方式: A a;即可

 

抑制由构造函数定义的隐式转换 :即在构造函数前声明 explicit 该关键字仅能用于类的内部的构造函数的声明上,在类外定义则不需重复(现在还没有用到,之后需要完善!)


 

析构函数 :确保清除 not to be

     和析构相反,这是为了毁灭,如果说构造是出生的话 那么析构就是死亡 ,然而销毁你创造的对象又是那么的容易被遗忘。析构函数同样是是由编译器调用的,名字和类的一致只不过前面多了~,并且析构函数不能带任何参数(因为析构函数不需要任何选项 当然啦!人家是毁灭!)

    

        

(写的这些都不太完善 等我的阅历更深的时候 我就来好好完善它吧 )