
c++之隐式成员函数
c++自动提供下列成员函数:
1.默认构造函数,如果没有定义构造函数
2.复制构造函数,如果没有定义
3.复制操作符,如果没有定义
4.默认析构函数,如果没有定义
5.地址操作符,如果没有定义
我的一篇文章《c++之参数传递》中的StingBad案例就出现了:两次复制构造函数,导致析构函数被调用多了两次。
一、默认构造函数
1.如果用户没有提供任何构造函数,c++创建默认构造函数(没有任何参数,也不执行任何操作)
2.用户定义构造函数,带参数的也可以是默认构造函数,只要参数都有默认值。
二、复制构造函数(用户没有定义与赋值是相同的的构造函数,譬如用户定义类Sting(& p,int i)而没有定义Sting (& p),当用户用String s1("asdds")系统会复制(创建)构造函数Sting(&p))
1.复制构造函数用于将一个对象复制到新创建的对象中,也就是说用于初始化过程中,二不是常规赋值中。类的复制构造函数原型通常如下:
Clsaa _name (const Class_name &)
譬如:
StringBad (StringBad &)
1.1复制构造函数何时会被调用呢?
(1)新建一个对象并将其初始化为同类现有对象时,复制构造函数会被调用(当按值传递对象或函数返回对象时)系统会创建历史对象,都会使用复制构造函数。
2.2复制构造函数的功能
(1)默认的复制构造函数是逐个复制非静态成员,复制的是成员的值。
3.3复制构造函数有什么缺点?
(1)不管对象是如何创建的,析构函数都会在对象过期时调用(所以有一些对象被隐式复制构造函数创建,而没有任何提示,用户不知道对象的创建,如果有指针成员可能会对同一内存多次释放导致出错)
<pre>
如果类中包含有new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据而不是指针(深度复制),这样析构函数释放内存时就不会对同一内存多次释放