#ifndef __MEM__H #define __MEM__H #includeusing namespace std; //自動管理內存塊 typedef unsigned char byte; class Mem { private: byte* mem; int size; void ensureMinSize(int minSize); public: Mem(); Mem(int sz); ~Mem(); int msize(); //byte* pointer(); byte* pointer(int minSize=0); }; Mem::Mem() { mem =0; size =0; } Mem::Mem(int sz) { mem =0; size =0; ensureMinSize(sz); } Mem::~Mem() { delete []mem; } int Mem::msize() {//當前的內存大小 return size; } void Mem::ensureMinSize(int minSize) {//自動增長申請內存 if(size < minSize) { byte* newmem = new byte[minSize]; memset(newmem+size,0,minSize - size); memcpy(newmem,mem,size); delete []mem; mem = newmem; size = minSize; } } //byte* Mem::pointer() //{//返回當前內存的首地址 //return mem; //} byte* Mem::pointer(int minSize) {//重新增長內存並返回內存的起始地址 ensureMinSize(minSize); return mem; } #endif
#include mem.h class Mystring { public: Mystring(); Mystring(char *str); ~Mystring(); void concat(char *str); void print(ostream &os); private: Mem *buf; }; Mystring::Mystring() { buf = 0; } Mystring::Mystring(char *str) { buf = new Mem(strlen(str)+1); strcpy((char*)buf->pointer(),str); } void Mystring::concat(char *str) { if(!buf) buf = new Mem; strcat((char*)buf->pointer(buf->msize()+strlen(str)),str); } void Mystring::print(ostream &os) { if(!buf) return ; os<pointer()<
盡量不要把默認參數作為一個標志去決定執行函數哪一塊,這是基本原則.在這種情況下,只要能夠就應該把函數分解成兩個或者多個重載的函數。下面這種方式就是把默認參數作為決定執行
Mystring::Mystring(char *str) { if(! *str) { buf =0; return; } buf = new Mem(strlen(str)+1); strcpy((char*)buf->point(),str); }