有类则有构造函数,每当我们要创建类的对象是,编译器会自动调用类中的构造函数。构造函数有默认的、合成的、自定义的,当然还可以被重载,至于具体调用哪个构造函数那取决于实参。我们都知道构造函数的函数名就是类名,并且没有返回值类型,为什么?你想啊,构造函数虽然也是类的成员函数,但它是在对象创建前由编译器自动调用的,而非程序员调用,再说了,那也不是你想调用就调用的,对象都没创建好,你拿什么调用它啊。当对象创建完后,对象的类型也就确定,准确地说是静态类型确定了,也就是类自身的类型。那么此时构造函数也就调用完毕了,如果它有返回值,你觉得对对象自身的类型有益么?当然无益!
而且这种无返回类型的与void又截然不同,虽然void一般函数不返回任何值,但一般函数可以选择是否返回某个类型的值,也就是说即使现在无返回值,但不确保以后没有返回值,那么编译器还得通过某种方式来知道如何处理那个返回值。而构造函数肯定是不会有返回类型的,所以设计者通过某种特殊的设计使其不带返回类型的函数。
构造函数与其它普通成员函数之间除了没有函数返回类型外,它还可以包含一个初始化列表,语法就不用说了,它的功能就是对类中的数据成员进行初始化,当然很多人包括我自己以前都习惯在构造函数体内对数据成员进行赋值操作,对于内置类型数据来说,两种方式的结果和效率是一样的。但是对于自定义数据类型(类类型对象)可能会出现重复调用构造函数,如果类中某个类类型数据成员所属的类没有默认构造函数的话,还可能会出现掉用默认构造函数失败。因为构造函数分两个阶段:
1、初始化阶段——对类中数据成员进行初始化
2、普通的计算阶段——执行构造函数体内的语句
而初始化阶段执行与计算阶段之前,所以会出现构造函数被重复调用的结果,而且有些类型的数据成员必须通过初始化列表来进行初始化,比如说const、引用类型,因为这些类型只能直接初始化,而不能被赋值。
因此我们应尽量使用构造函数初始化列表,不仅提高了程序的效率还能避免一些不必要的错误,这是一种好的编程习惯和风格、、、
一心向学