C++是面向对象的编程语言,编程中我们不可避免的需要自定义的类,在定义自己的类时我们应该关注类中的几个基本函数的定义——构造函数,复制构造函数,析构函数,赋值操作函数。现在简单介绍一下以上几个函数,由于水平有限,不足之处欢迎大家指正,以便互相学习,本人博客http://blog.csdn.net/IAccepted。
我们在定义类时必须存在构造函数,但这里的必须存在并不是说程序员自己必须定义自己的构造函数,因为如果程序员不显示定义,编译器会生成一个默认构造函数。构造函数是一个特殊的成员函数,创建类类型的对象时都会调用构造函数。我们可以重载构造函数来实现不同的初始化规则。但是值得注意的是一旦显示定义了有参构造函数,系统就不会再生成默认无参构造函数。这通常会带来以下不便:
1.生成该类的每个对象都必须传递初始化参数进行初始化;
2.该类型不能用作动态分配数组的元素类型;
3.该类类型的静态分配数组必须为每个元素提供一个显示的初始化式;
实际上,如果定义了其他的构造函数,则提供一个默认构造函数几乎总是对的【C++ primer】http://blog.csdn.net/IAccepted
当然我们还可以编写构造函数来实现类类型对象的隐式转换,着相对较简单不再详述,欢迎访问本人博客:http://blog.csdn.net/IAccepted
一般情况下利用一个同类对象初始化一个对象和简单的复制一个对象很简单。很多时候复制构造函数我们并不显示使用,在实参为类对象类型或返回值为类对象类型的值时都会调用复制构造函数,与构造函数类似,如果程序员不显示的定义复制构造函数,编译器也会为我们合成一个复制构造函数。一般情况下,类中如果只包含类类型成员或C++内置除指针外的类型的话,编译器为我们合成的默认复制构造函数就可以实现复制,无需显示定义复制构造函数,对于类中的类类型成员,会再调用自己的复制构造函数进行复制,类似与解箱操作,一层层的复制,知道最终全部为值类型。
注意指针类型是个特例,因为默认的复制构造函数只进行简单的值复制,所以如果类中存在指针,则经过复制,两个对象的指针成员就会指向同一个内存地址,这样是很危险的,首先两对象变的不再独立,任何一个对象修改了其中指针变量指向的内存中的值,另一个对象也会受到影响,另外,删除一个对象时,析构函数会释放其中指针类型所指向的内存空间,这样会造成另一个对象中的指针变成悬垂指针,有关指针的介绍大家可以查看本人的另一篇博客http://blog.csdn.net/iaccepted/article/details/6741600 。通常实现带指针类型对象的复制构造我都是使用类似值类型的方式来实现的,即为每个副本都重新new一个指针类型的对象然后进行值拷贝。当然也可以使用智能指针。
析构函数就相对比较简单,主要针对的就是分配了系统资源的类对象在生命周期结束是回收资源,这里的生命周期可以是程序结束或者delete一个动态分配内存的对象。
如果类需要析构函数,则它也需要赋值操作符和复制构造函数。这是因为本类涉及到非值类型的成员,根据前面说的复制构造函数的内容,这点很容易理解,这是一个非常有用的规则,欢迎访问本人博客:http://blog.csdn.net/IAccepted
可以重载赋值操作符=,赋值操作符不需要分配新对象,只是抱枕给其中的指针所指向的对象赋新值,而不是给指针本省复制。其返回值必须为*this的引用
即
classA classA::operator=(const classA& a){ …… …… return *this; }
欢迎访问本人博客:http://blog.csdn.net/IAccepted
转载请注明出处!