#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);
}