看了一个帖子,问类的构造函数与初始化函数的区别。其实搞清楚这个区别,需要先搞清楚面向对象中,方法和过程化语言中函数的区别。
过程化语言中,函数可以看做一个下水管道的一部分。所有的下水管道部分组成一个网络,当数据(也就是水)灌入时,会最终有个一个或多个出口流出。而这些函数(管道)不管是否实际有水,都是始终存在,且唯一存在的。
面向对象的设计语言的思想和过程化语言的思想最大的区别在于,面向对象看待机器模拟客观事物时,是仿真的存在一个个实体。而每个实体有自己的类型。 那些属于类型的函数(就是方法)实际是这个实体的组成部分。有些实体可能从程序入口一直持续到结束。但很多实体是在运行时,才被创建出来。
我们写的类,包括类的定义和类的方法的实现,并不是具体的实体,也就是不等同于过程化语言中上面的那些管道。只是个模板,当需要实体创建时,才生成 出一个具体的类的实体存在于内存中,而此时当这个类有方法(这是屁话,至少有构造和析构函数)时,该实体对应该类的方法就存在了一个特定的函数。可能这个 函数被这个实体独立使用,也可能是用函数指针的方式被多个实体共同使用,但此时这个实体所引用的方法,才是如上面过程化语言的水管子。
因此,在面向对象语言中,存在一个实体创建的工作,这个在C这类过程化语言中通常是没有的。特殊写法,也可以操作。而这个创建工作本身就是属于构造,就是构造一个类的具体实体。如果这个类包含成员变量等,则这个构造过程就包括了开辟空间等操作。
而初始化,和构造没有关系,可以这样举例。你有张白纸,打算画图表还是打算写信,如果前者你需要初始化一下,画个二维格子,如果是后者,你需要画个 一维线条,区分每一行。这些工作叫做初始化。其前提是你存在了这个白纸。而在面向对象里,任何一个白纸,实质是个实体,构造函数的作用是创造这个白纸。可 能这个纸的大小,厚薄,是你关心的,这些和白纸的创建有关,则属于构造。
废话这么多,说点简单的判断方法(并不严格正确),如果涉及类的成员自身的空间操作,应该放在构造里,如果涉及空间内部值的操作。则放在初始化里。