头文件 DString.h如下
#ifndef __DSTRING_H #define __DSTRING_H #endif #include <stddef.h> class DString { public: DString(const char * c = NULL); // default constructor DString(const DString &str); // copy constructor - implement DEEP copy ~DString(); /* 必须使用成员函数重载的运算符 = ( ) [ ] -> 必须使用友元函数重载的运算符 << >> P.S. 一目运算符,建议使用成员函数;二目运算符,建议只用友元函数 */ DString& operator = (const DString &str);
friend DString operator + (const DString &s1, const DString &s2);
char* dcopy(char * dst, const char * src); private: char * m_data; };
实现如下DString.cpp
#include <string.h> #include "DString.h" DString::DString(const char * c) { if(NULL == c) { m_data = new char(‘\0‘); } else { m_data=new char[strlen(c) + 1]; dcopy(m_data, c); } } DString::DString(const DString &str) { if(NULL== str.m_data) { m_data=NULL; } else { m_data=new char[strlen(str.m_data) + 1]; dcopy(m_data, str.m_data); } } DString::~DString() { delete [] m_data; } DString& DString::operator = (const DString &str) { if(NULL==str.m_data) { m_data=NULL; return *this; } else { delete [] m_data; m_data=new char[strlen(str.m_data)+1]; dcopy(m_data,str.m_data); return *this; } } // no :: because friend function doesnt belong to the class DString operator + (const DString &s1, const DString &s2) { if(NULL == s1.m_data) { return DString(s2); } if(NULL == s2.m_data) { return DString(s1); } char * temp = new char[strlen(s1.m_data) + strlen(s2.m_data) + 1]; strcpy(temp, s1.m_data); strcpy(temp+strlen(s1.m_data), s2.m_data); return DString(temp); } char* DString::dcopy(char * dst, const char * src) { char * tmp = dst; while(*src != ‘\0‘) { *tmp++ = *src++; } *tmp = 0; return dst; }
调用入口main.cpp
#include "DString.h" int main(int argc, char* argv[]) { DString s1("abcde"); //call default cons DString s2 = "ABC"; //call default cons DString s3 = s2; //call copy cons DString s4(s3); //call copy cons s1 = s4; //call operator = s4 = s1 + s2 + "ding"; //call default cons then + then + then = return 0; }
一些知识点(以在代码中出现的顺序排列)
原文:http://www.cnblogs.com/deanding/p/6506050.html