#ifndef __MEM__H
#define __MEM__H
#include<iostream>
using 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<<buf->pointer()<<endl;
}
Mystring::~Mystring()
{
delete buf;
}
void main()
{
Mystring s("mytest");
s.print(cout);
s.concat(" is weikai");
s.print(cout);
}
尽量不要把默认參数作为一个标志去决定运行函数哪一块,这是基本原则.在这样的情况下,仅仅要可以就应该把函数分解成两个或者多个重载的函数。以下这样的方式就是把默认參数作为决定运行
Mystring::Mystring(char *str)
{
if(! *str)
{
buf =0;
return;
}
buf = new Mem(strlen(str)+1);
strcpy((char*)buf->point(),str);
}