类(传入的形参为指针形式)-字符串的实现

#ifndef __MYSTRING__
#define __MYSTRING__

//实现字符串-类,构造函数中将指针作为参数
class String
{
public:                                 
    String(const char* cstr=0);
    //需要自己写拷贝构造函数和拷贝赋值函数,实现“深拷贝”;否则会直接复制指针m_data,这样多个对象中的m_data指向的同一片地址,这叫“浅拷贝”                  
    String(const String& str);                    
    String& operator=(const String& str);
    //需要自己写析构函数,因为在构造函数中可能动态分配了内存,使用默认的析构函数会造成内存泄漏         
    ~String();                                    
    char* get_c_str() const { return m_data; }
private:
    char* m_data;
};

#include <cstring>

//构造函数,首先判断从指针参数是不是0
inline
String::String(const char* cstr)
{
   if (cstr) {
      m_data = new char[strlen(cstr)+1];
      strcpy(m_data, cstr);
   }
   else {   
      m_data = new char[1];
      *m_data = '\0';
   }
}

inline
String::~String()
{
   //分配内存时,分配的是数组形式,现在要用delete[]
   delete[] m_data;
}

//拷贝赋值函数,为了可以使用连等a=b=c的形式,所以返回值不能为void
inline
String& String::operator=(const String& str)
{
   //判断是不是赋值给本身
   if (this == &str)
      return *this;

   delete[] m_data;
   //下行中的str.m_data可以直接取私有变量m_data,是因为相同类型的对象互为friend
   m_data = new char[ strlen(str.m_data) + 1 ];
   strcpy(m_data, str.m_data);
   return *this;
}

inline
String::String(const String& str)
{
   m_data = new char[ strlen(str.m_data) + 1 ];
   strcpy(m_data, str.m_data);
}

#include <iostream>
using namespace std;

ostream& operator<<(ostream& os, const String& str)
{
   os << str.get_c_str();
   return os;
}

#endif

 

posted @ 2021-04-22 16:18  阿刚的代码进阶之旅  阅读(220)  评论(0编辑  收藏  举报