首页 > 代码库 > 构造函数的那些事
构造函数的那些事
构造函数:是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。--百度百科
析构函数和构造函数相对应,它的功能是释放对象的内存空间。为了便于分析和理解,博客内容加入了析构函数,并且将初始化列表单独拿出来分析。博客结构:
详细内容如下:
一 构造函数:
1构造函数是干什么的?
当一个类对象被创建时,编译系统后需要为对象分配内存空间,C++中这个工作是由构造函数来完成。需要注意的是,初始化不等于赋值,初始化即分配空间,赋值是向内存空间插入数据。
2构造函数都有那些类型?
默认构造函数:即如果没有显示的写出构造函数,系统将会自动生成一个构造函数,这个构造函数没有参数,函数体为空,它什么都不做;
一般构造函数(或者叫做重载构造函数):一个类构造函数可以有多个构造函数,参数的不同,就可以形成函数的重载,创建对象时根据参数来判断具体调用哪个构造函数;
复制构造函数:当类对象本身的引用作为构造函数的参数时,构造函数会复制出一个新的对象,已存在的对象的数据成员的值会被复制到新创建的对象中。
3构造函数有那些特点?
构造函数的命名必须和类名完全相同;构造函数用于完成对象初始化,所以它没有返回值,不能用任何数据类型来修饰它;构造函数不能被显示调用(父类构造函数带参数除外),只能在创建对象时由编译器自动调用。如果一个类只定义了私有的构造函数,将无法通过new关键字创建其对象。构造函数不可以是虚函数。
二析构函数:
析构函数和构造函数向对应,它是为了释放对象内存而存在的。它不能被显式调用,只能在删除对象时由编译器调用;它没有返回值,所以不能用任何(包括void)修饰;没有参数(不能重载)。
三构造函数的初始化列表:
1为什么使用初始化列表?构造函数初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。这两种方式有什么区别?使用初始化列表,那么构造函数在创建对象时分配内存空间,并且直接进行赋值;如果是在函数体内赋值,那么首先要调用构造函数分配内存,然后调用函数体进行赋值操作,也就是赋值操作需要比初始化列表多一个步骤,对于成员变量较少的类没有区别,但是对于有大量的成员变量的类,创建对象就是一种灾难。
2 初始化列表的一般格式:
Class A { Private: <span style="white-space:pre"> </span>int a; <span style="white-space:pre"> </span>Int b; Public: <span style="white-space:pre"> </span>A(int _a,int_b):a(_a),b(_b) {} }
对于无默认构造函数的继承关系:
Class person { Public: <span style="white-space:pre"> </span>Person(string name,string sex):_name(name),_sex(sex) {} Private: <span style="white-space:pre"> </span>String _name; <span style="white-space:pre"> </span>String _sex; } Class man :public person { Public : <span style="white-space:pre"> </span>Man(string name ,string sex, string age):person(name,sex),_age(age) <span style="white-space:pre"> </span>{} Private: <span style="white-space:pre"> </span>String _age; }
3 那些对象初始化必须要使用初始化列表?
(1) const常量 const常量不能被赋值,只能初始化,所以需要使用初始化列表。
Class A { Public : <span style="white-space:pre"> </span>A(int b):_b(b) {} //正确 <span style="white-space:pre"> </span>A(int b) {_b =b;} //错误,常量不能赋值。 Private: <span style="white-space:pre"> </span>Const int _b; }
注意,上述两个构造函数不能共存。
(2) 含有自定义数据类型(类)对象的初始化
Class Person { ; } Class Man { Public : <span style="white-space:pre"> </span>Man(Person & sa): _sa(sa) {} Private: <span style="white-space:pre"> </span>Person _sa; }
(3) 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写到初始化列表中。
Class A { Public : <span style="white-space:pre"> </span>A(int r):_r(r) {} Private: <span style="white-space:pre"> </span>Int &_r; }
构造函数内容繁琐,很多细节需要反复去验证。
以上为个人理解,如有错误,敬请指正。
构造函数的那些事