编写String类的构造、析构、赋值和拷贝构造函数

声明如下:

class String { private: char * m_data; public: String(const char *str=null);//构造函数 String(const String &other);//拷贝构造函数 ~String(void); String& operate =(const String &other);//赋值函数 };

需要注意的是const的使用,在Effective C++中的第三条款就是:尽量使用const。也就是可以使用的地方尽量使用const,在这里就是这样,加入了const之后对于程序的健壮性有了提高。

接下来是函数的实现:

  1. 构造函数:String:String(const char* str=null) { if(str==null) { m_data=new char[1]; m_data[0]='/0'; } else { int length = strlen(str); m_data = new char[length+1]; strcpy(m_data,str); } } 需要注意的地方时str需要判断null
  2. 拷贝构造函数:String::String(const String &other) { if(other.m_data==null) { m_data = new char[1]; *m_data = '/0'; } else { int length = strlen(m_data); m_data = new char[length+1]; strcpy(m_data, other.m_data); } } 这里也最好判断下null,其他没有什么问题,这里我一开始以为other.m_data是不能取的,试验了才知道是可以的,看起来连private都还不清楚啊。
  3. 析构函数:String::~String(void) { delete [] m_data; } 删除数组的方式不要忘记了
  4. 赋值函数:String& String::operate =(const String &other) { if(this == &other) return *this; delete [] m_data; if(other.m_data==null) { m_data = new char[1]; *m_data = '/0'; } else { int length = strlen(m_data); m_data = new char[length+1]; strcpy(m_data, other.m_data); } return *this; } 其中检查自赋值非常重要,其他就是在赋值之前要先释放之前的空间。

这么简单的东西却让我搞的很头疼,学过的东西还是忘的太多了。

你可能感兴趣的:(c,String,null,delete,Class)