C++笔记——关于拷贝构造、拷贝赋值、析构(0)

其实这一块展开来讲会很长,这里只是大致讲一下相关的定义、作用。都是一些很浅显的内容。

拷贝构造函数:

图一

在图一中,红色箭头所指的函数就是构造函数。构造函数输入类型是自己,那么就是拷贝构造函数。用法类似于:

String s1;
s3(s1);    // 这样会调用拷贝构造函数

图一中构造函数下面一行就是拷贝赋值函数。在下面这种情况会调用拷贝复制函数:

String s2 = s3;

值得注意的是左侧函数名部分,不能够省略掉&,因为这个类有指针。

与类同名,但是前面带着波浪号~的是析构函数。

图二

构造函数和析构函数的定义如图二所示,注意inline,因为这是在类的定义外面写的,所以要注意机上inline定义为内联函数,否则编译器会当作函数处理。图一中的get_c_str就是默认内联函数了,因为在类定义的时候就已经定义了。析构函数里面要注意不能够省略掉delete,不然会导致内存泄露。基本上只要类里面出现了动态分配的指针,就需要注意及时delete

图三

图三就是具体用法的例子。

如果类里面含有动态分配的指针,必须要有拷贝构造函数和拷贝赋值函数。如果没有自己写的拷贝赋值函数,那么就会使用编译器默认分配的函数,例如说上图中b = a,默认的拷贝赋值函数会将类里面的内容原原本本地复制过去,而因为类里面的内容只有指针,因此会导致两个类的指针指向同一个地址;而b原本指向的地方因为没有被销毁,但是又没有指针指向它,导致无法访问,最终就会造成内存泄露。而我们使用的时候理解是复制指针指向的内容,因此默认的拷贝赋值函数并不能够满足我们的需求。题外话,默认拷贝赋值函数这种行为称为“浅拷贝”。

拷贝构造函数如上图所示,注意这里隐藏的知识点:同一个类下的兄弟互为friend,即可以访问另一个对象的private数据。

上图是拷贝赋值函数,注意检测,这里的检测一定不能够丢掉,因为这里的思路就是,将左侧的内容给清空,然后重新分配一个和右侧内容相同大小的空间,最后将右侧对象的内容复制到左侧对象(自己)去。上图右侧是使用的例子。

猜你喜欢

转载自www.cnblogs.com/yejianying/p/cpp_notes_copy_ctor_copy_assign_destroy_0.html