C++面向对象基础(2)-String class(带指针)

基本结构

#ifndef _MYSTRING_   // 防卫式声明
#define _MYSTRING_

class String
{
  ...
}

String::function (...) ...
Global-function (...) ...

要完成的功能
1、无参构造和有参构造
2、拷贝构造和拷贝赋值
3、操作符<<重载

注意:编译器自己默认的拷贝按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。

big three 三个特殊函数

接口设计

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; }  //成员函数名后+const表示只读函数,不能修改函数里的类数据成员的值
  private:
    char* m_data;
}

函数设计

// 构造函数----动态分配内存
inline
String::String (const char* cstr = 0)
{
  if (cstr) {     // 判断指针是否为0
    m_data = new char[ctrlen(cstr)+1];
    strcpy(m_data, cstr);
  }
  else {     // 未指定初值
    m_data = new char[1];
    *m_data = '\0';
  }
}

// 析构函数----释放分配的内存,避免内存泄漏
inline
String::~String()
{
  delete[] m_data;
}

如果是带指针的类,就一定要有拷贝构造和拷贝赋值

// 拷贝构造
inline
String::String(const String& str)
{
  m_data = new char[ strlen(str.m_data) + 1 ];
  strcpy(m_data, str.m_data);
}
// 拷贝赋值
inline
String& String::operator=(const String& str)
{
  if (this == &str)   // 自我检测(,必须要有,非常重要)
    return *this; 
  detele[] m_data;
  m_data = new char[ strlen(str.m_data) + 1];
  strcpy(m_data, str.m_data);
  return *this;
}

操作符<<重载,必须为全局函数

#include <iostream.h>
ostream& operator<<(ostream& os, const String& str)
{
  os << str.get_c_str();
  return os;
}
posted @ 2022-03-29 17:19  Stella77  阅读(112)  评论(0)    收藏  举报