C++基础(一)构造函数、析构函数、拷贝构造函数

来源:互联网 发布:维也纳会议 知乎 编辑:程序博客网 时间:2024/05/20 03:43

在C++中你写一个空类,什么都不做,编译器会给你生成一个构造函数,一个拷贝构造函数,一个拷贝赋值函数(运算符重载),一个析构函数,而且是当他们被调用的时候才生成。这说明这四个函数的重要;这里主要说他们其中的三个:

C++中的构造函数用来产生对象,他告诉编译器如何初始化一个对象,以及其它一些前期工作;相对应的析构函数告诉怎么销毁一个对象;

关于对象的初始化:

1)初始化列表,相当于定义的同时就初始化。

2)函数内初始化,相当于申请空间,再赋值,效率较低。

关于初始化列表,要知道有些数据成员是不能在初始化列表中初始化的:

1)数组  

2)static类数据成员:因为static数据成员属于整个类,不属于哪个对象,如果每个对象都来初始化一次,那么static数据成员就没有意义了;

3)非static的const成员,必须要在初始化列表初始化:这个其实很好理解:我们对于const成员在定义的时候就要初始化,当然在对象申请空间的时候也是。

构造函数是没有返回值的,他是给编译器用的,但是他可以有参数,或者不带参数,这就说明,一个类可以有多个构造函数,这就是构造函数的重载;

那析构函数可不可以重载呢?如果上面说构造函数是给编译器看的,至少人还能进行干预,比如我可以决定使用上面参数来进行初始化;对于析构函数人则完全无法干预了,析构函数不带参数,所以析构函数只能有一个,没法重载。


关于析构函数:
析构函数主要用来“善后”,而且是系统自动执行,程序员不能在这个过程中显式的进行干预,析构函数只有一个,且不带参数;

默认的析构函数无法释放堆资源,如果在构造函数中申请了堆资源,要记得在析构中释放,这里涉及深浅拷贝的问题;

如果两个对象中都有一个指针,指针指向的是同一块资源,那么两个对象被析构的时候,会两次释放同一块资源,就会有问题;


关于拷贝构造函数:

拷贝构造函数顾名思义,首先他是构造函数,他也没有返回值,他可以看成是有参数的构造函数,他告诉编译器以另外一个对象为蓝本,创造一个新对象;

默认的拷贝构造函数是按位复制的,有时候这样会出问题,所以有时候我们要自己定义拷贝构造函数,这就是深拷贝,比如上面说的问题,我们要复制指针,还是要复制指针指向的堆空间?这个需要显式的定义,编译器不会帮你。










0 0