手撕String类

注意:当类中包含了指针类成员时,需要重载拷贝构造函数、赋值函数和析构函数

由此面试中经常要求实现出String类的构造函数、拷贝构造函数、赋值函数以及析构函数。
其大致如下:

class MyString {
 public:
  MyString(const char* str = nullptr);         //普通构造函数
  MyString(const MyString& other);             //拷贝构造函数
  ~MyString(void);                             //析构函数
  MyString& operator=(const MyString& other);  //赋值函数
 private:
  char* m_data;  //用于保存字符串
};

//普通构造函数
MyString::MyString(const char* str) {
  if (str == nullptr) {
    m_data = new char[1];
    *m_data = '\0';
  } else {
    int length = strlen(str);
    m_data = new char[length + 1];
    strcpy(m_data, str);
  }
}
//析构函数
MyString::~MyString(void) {
  delete[] m_data;  //或delete m_data
}
//拷贝构造函数
MyString::MyString(const MyString& other)  //输入参数为const
{
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
}
//赋值函数
MyString& MyString::operator=(const MyString& other) {  //输入参数为const型
  if (this == &other) return *this;
  delete[] m_data;  //释放原有内存空间
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
  return *this;  //返回本对象应用
}

测试:

#include <cstring>
#include <iostream>

using namespace std;

class MyString {
 public:
  MyString(const char* str = nullptr);         //普通构造函数
  MyString(const MyString& other);             //拷贝构造函数
  ~MyString(void);                             //析构函数
  MyString& operator=(const MyString& other);  //赋值函数
  friend ostream& operator<<(ostream& out, const MyString& obj);
  friend istream& operator>>(istream& in, MyString& obj);

 private:
  char* m_data;  //用于保存字符串
};

//普通构造函数
MyString::MyString(const char* str) {
  if (str == nullptr) {
    m_data = new char[1];
    *m_data = '\0';
  } else {
    int length = strlen(str);
    m_data = new char[length + 1];
    strcpy(m_data, str);
  }
}
//析构函数
MyString::~MyString(void) {
  delete[] m_data;  //或delete m_data
}
//拷贝构造函数
MyString::MyString(const MyString& other)  //输入参数为const
{
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
}
//赋值函数
MyString& MyString::operator=(const MyString& other) {  //输入参数为const型
  if (this == &other) return *this;
  delete[] m_data;  //释放原有内存空间
  int length = strlen(other.m_data);
  m_data = new char[length + 1];
  strcpy(m_data, other.m_data);
  return *this;  //返回本对象应用
}

ostream& operator<<(ostream& out, const MyString& obj) {
  out << obj.m_data;
  return out;
}

istream& operator>>(istream& in, MyString& obj) {
  //分配内存空间
  obj.m_data = new char[1024];
  in >> obj.m_data;
  return in;
}

int main() {
  MyString a("abc");
  cout << a << endl;
  MyString b = a;
  cout << b << endl;
  b = "efg";
  cout << b << endl;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值