5. 三大函数:拷贝构造 拷贝赋值 析构函数

末蓝、 2022-12-28 14:23 318阅读 0赞
  • String 类

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70

  1. 拷贝构造和拷贝赋值应该怎么写
  2. 只要类里面带指针,一定不要用编译器的默认拷贝构造函数,一定要自己写
  • 三个特殊函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70 1

  1. String (const char\* cstr = 0); //构造传入一个指针,默认赋值为0
  2. String (const String& str); //以自身类型作为参数,称为拷贝构造函数
  3. String& operator = (const String& str); //赋值运算符重载,同事以自身作为参数,称为拷贝赋值
  4. 只要类带着指针,一定要写这个函数
  5. String(); //析构函数 当对象死亡(离开作用域)的时候 会调用
  • 构造函数和析构函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70 2

  1. 类中如果有指针,多半要做动态分配,既然做了动态分配,做了动态分配,则要在析构函数里将分配的内存还给系统
  2. 图中例子,离开右下角作用域的时候,要调用3次析构函数
  • 含指针的类必须要有拷贝构造函数和拷贝赋值函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70 3

  1. 如果不自己写拷贝构造函数和拷贝赋值函数,很容易造成浅拷贝
  • 拷贝构造函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70 4

拷贝构造函数中应该创造一个足够的空间存放蓝本

图中蓝色的两行意思完全相同,即以s1为蓝本,创建出一个s2

调用拷贝构造函数,创造空间,将蓝本的内容拷贝过去,叫做深拷贝

  • 拷贝赋值函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHk3MTA2NjA1NDE_size_16_color_FFFFFF_t_70 5

拷贝赋值操作是两个已有对象的操作

ran hous1赋值给s2,s2要先杀掉自己,然后分配一块跟s1一样大的存储空间,将s1拷贝进去,然后返回自身引用

if 语句是检测是不是自己赋值给自己,看二者的指针是不是指向同一块内存,如果不写的话,如果发生自我

赋值,则后面的语句结果会出错

发表评论

表情:
评论列表 (有 0 条评论,318人围观)

还没有评论,来说两句吧...

相关阅读

    相关 拷贝构造函数函数

    一、拷贝构造函数 (一)、何为拷贝? 拷贝一词来源于英文中的copy,译为:抄写,复制,复制品。将原有物件,按照同样式的在来一份。 \\举个栗子: 饭点到了,和