其实这一块展开来讲会很长,这里只是大致讲一下相关的定义、作用。都是一些很浅显的内容。
拷贝构造函数:
图一
在图一中,红色箭头所指的函数就是构造函数。构造函数输入类型是自己,那么就是拷贝构造函数。用法类似于:
String s1;
s3(s1); // 这样会调用拷贝构造函数
图一中构造函数下面一行就是拷贝赋值函数。在下面这种情况会调用拷贝复制函数:
String s2 = s3;
值得注意的是左侧函数名部分,不能够省略掉&
,因为这个类有指针。
与类同名,但是前面带着波浪号~
的是析构函数。
图二
构造函数和析构函数的定义如图二所示,注意inline
,因为这是在类的定义外面写的,所以要注意机上inline
定义为内联函数,否则编译器会当作函数处理。图一中的get_c_str
就是默认内联函数了,因为在类定义的时候就已经定义了。析构函数里面要注意不能够省略掉delete
,不然会导致内存泄露。基本上只要类里面出现了动态分配的指针,就需要注意及时delete
。
图三
图三就是具体用法的例子。
如果类里面含有动态分配的指针,必须要有拷贝构造函数和拷贝赋值函数。如果没有自己写的拷贝赋值函数,那么就会使用编译器默认分配的函数,例如说上图中b = a
,默认的拷贝赋值函数会将类里面的内容原原本本地复制过去,而因为类里面的内容只有指针,因此会导致两个类的指针指向同一个地址;而b
原本指向的地方因为没有被销毁,但是又没有指针指向它,导致无法访问,最终就会造成内存泄露。而我们使用的时候理解是复制指针指向的内容,因此默认的拷贝赋值函数并不能够满足我们的需求。题外话,默认拷贝赋值函数这种行为称为“浅拷贝”。
拷贝构造函数如上图所示,注意这里隐藏的知识点:同一个类下的兄弟互为friend
,即可以访问另一个对象的private
数据。
上图是拷贝赋值函数,注意检测,这里的检测一定不能够丢掉,因为这里的思路就是,将左侧的内容给清空,然后重新分配一个和右侧内容相同大小的空间,最后将右侧对象的内容复制到左侧对象(自己)去。上图右侧是使用的例子。