7字符串类的实现(带指针)

  • 拷贝构造
  • 拷贝赋值
  • 析构函数

new分配内存

拷贝构造和拷贝赋值有一个默认版本

如果数据带指针,需要写一个新的拷贝函数

否则默认版本只会对指针进行操作,例如b = a,只会将b的指针也指向a,而原本b指向的东西漂浮,这就叫内存泄露

改动a,b也随之改变,叫做浅拷贝

  • private:存储字符串的数据应该是一个指针
  • 指针需要额外写的构造函数
    • 拷贝构造String::String const String& str)

    • 拷贝赋值String& String::operator(const String& str)

      • 检测自我赋值
      • 先把左边杀掉,再创造相同空间,最后复制
    • 析构函数

      delete[] m_data

8堆,栈与内存管理

  • 操作符重载<<,与complex类似

  • 栈stack和堆heap

    • 栈,是存在于作用域{}的内存空间,由析构函数自动清理

    • 堆,new生成,是操作系统提供的global内存空间,程序可动态分配获得区块,因此必须手动delete。

    • static objects,程序结束才死亡

    • global objects

    • heap objects,堆

Complex* p = new Complex(1,2)

new

  • 分配内存
  • 转型
  • 构造函数

delete

  • 析构函数
  • 释放内存

new和delete占用多少内存

Complex* p = new Complex[3]

array new和array delete

9 复习String类的实现过程

  1. 类声明
  2. private数据类型
  3. publice
  4. 构造函数
  5. 拷贝构造
    拷贝赋值
    析构函数
  6. 写的时候,函数名→参数(输入)→返回类型(输出)
    能不能用const,能不用传引用&