C++ 学习 String类

发布时间:2024年01月21日

引用:侯捷

1.防卫式申明

#ifndef __MYSTRING__
#define __MYSTRING__

#endif

2.string类定义?

1.构造函数:

????????String(const char* cstr=0);?

2.拷贝构造函数:

????????String(const String& str);?

3.赋值运算符重载:

????????String& operator=(const String& str);

4.析构函数:

????????~String();?

5.成员函数返回指向字符串数据的指针:

????????char* get_c_str() const { return m_data; }

????????注意,返回的指针指向的是内部存储,不应该被修改或删除。

6.成员变量:

????????char* m_data;

class String
{
public:                                 
   String(const char* cstr=0);                     
   String(const String& str);                    
   String& operator=(const String& str);         
   ~String();                                    
   char* get_c_str() const { return m_data; }
private:
   char* m_data;
};

?3.函数实现

1、构造函数

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';
   }
}

2、析构函数?

inline
String::~String()
{
   delete[] m_data;
}

3、拷贝构造函数

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

4、 操作符重载 =

inline
String& String::operator=(const String& str)
{
   if (this == &str)
      return *this;

   delete[] m_data;
   m_data = new char[ strlen(str.m_data) + 1 ];
   strcpy(m_data, str.m_data);
   return *this;
}

?5、操作符重载 <<

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

4、完整实现?

#ifndef __MYSTRING__
#define __MYSTRING__

class String
{
public:                                 
   String(const char* cstr=0);                     
   String(const String& str);                    
   String& operator=(const String& str);         
   ~String();                                    
   char* get_c_str() const { return m_data; }
private:
   char* m_data;
};

#include <cstring>

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[] m_data;
}

inline
String& String::operator=(const String& str)
{
   if (this == &str)
      return *this;

   delete[] m_data;
   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

?

文章来源:https://blog.csdn.net/qq_47530834/article/details/135629974
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。