头文件
/** * 书本:【ThinkingInC++】 * 功能:选择重载还是默认参数,头文件 * 时间:2014年9月6日14:54:28 * 作者:cutter_point */ #ifndef MEM_H_INCLUDED #define MEM_H_INCLUDED typedef unsigned char byte; class Mem { byte* mem; int size; void ensureMinSize(int minSize); //成员函数来增加内存块的大小 public: Mem(); Mem(int sz); //第二个构造函数确保Mem对象中有sz大小的存储区 ~Mem(); //析构函数释放空间 int msize(); //告诉我们当前Mem对象中还有多少字节 byte* pointer(); byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大 }; #endif // MEM_H_INCLUDED
定义文件
/** * 书本:【ThinkingInC++】 * 功能:选择重载还是默认参数,声明文件 * 时间:2014年9月6日14:54:58 * 作者:cutter_point */ #include"Mem.h" #include<cstring> using namespace std; /* class Mem { byte* mem; int size; void ensureMinSize(int minSize); //成员函数来增加内存块的大小 public: Mem(); Mem(int sz); //第二个构造函数确保Mem对象中有sz大小的存储区 ~Mem(); //析构函数释放空间 int msize(); //告诉我们当前Mem对象中还有多少字节 byte* pointer(); byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大 }; */ // void ensureMinSize(int minSize); //成员函数来增加内存块的大小 void Mem::ensureMinSize(int minSize) { if(size < minSize) //判定,只有给的最小大小比原来的大才重新申请空间 { byte* newmem=new byte[minSize]; //申请新的空间 /* 今天做题卡在MEMSET函数的使用上了, 本来以为int a[100]; memset(a, MAX,sizeof(a)); 就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位, 一般用于对字符型变量的初值进行赋值. */ //从newmem+size开始,一共minSize-size个全部重置为0 memset(newmem+size, 0, minSize-size); //memcpy提供了一般内存的复制。 //即memcpy对于需要复制的内容没有限制,因此用途更广。 memcpy(newmem, mem, size); //吧mem里面的内容复制到newmem中,长度是size //回收空间内存 delete []mem; mem=newmem; //吧新的地址赋值给对象 size=minSize; //吧新的size给对象 } } //Mem(); Mem::Mem() { mem=0; size=0; } //Mem(int sz); //第二个构造函数确保Mem对象中有sz大小的存储区 Mem::Mem(int sz) { mem=0; size=0; ensureMinSize(sz); //吧初始空间设置为sz个长度 } //~Mem(); //析构函数释放空间 Mem::~Mem() { delete []mem; } //int msize(); //告诉我们当前Mem对象中还有多少字节 int Mem::msize() { return size; } //byte* pointer(); //将一个指针指向一块内存。该内存至少有minSize大 byte* Mem::pointer() { return mem; } //byte* pointer(int minSize); byte* Mem::pointer(int minSize) { ensureMinSize(minSize); return mem; }
测试主函数
/** * 书本:【ThinkingInC++】 * 功能:选择重载还是默认参数,测试文件,创建一个string类 * 作为其他类的一种工具,以简化他们的内存管理(例如,它还可以隐藏由操作系统 * 提供的更复杂的内存管理细节) * 时间:2014年9月6日14:55:32 * 作者:cutter_point */ /* class Mem { byte* mem; int size; void ensureMinSize(int minSize); //成员函数来增加内存块的大小 public: Mem(); Mem(int sz); //第二个构造函数确保Mem对象中有sz大小的存储区 ~Mem(); //析构函数释放空间 int msize(); //告诉我们当前Mem对象中还有多少字节 byte* pointer(); byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大 }; */ #include"Mem.cpp" #include<cstring> #include<iostream> using namespace std; class MyString { Mem* buf; //简化内存管理 public: MyString(); MyString(char* str); //重载 ~MyString(); //链接两个string void concat(char* str); void print(ostream& os); }; //MyString(); MyString::MyString() { buf=0; } //MyString(char* str); //重载 MyString::MyString(char* str) //用str构造一个string类型 { buf=new Mem(strlen(str)+1); //为str创建内存空间 //用str构造一个string类型 strcpy((char*)buf->pointer(), str); //拷贝过去 } //~MyString(); MyString::~MyString() { delete buf; //回收空间内存 } //链接两个string //void concat(char* str); void MyString::concat(char* str) { if(!buf) //如果buf(指向mem的指针)内存为0的话,创建一个内存空间给他 buf=new Mem; //横向链接字符串,pointer返回一个指针,指向至少有buf->mszie()+strlen(str)+1的内存块 strcat((char*)buf->pointer(buf->msize()+strlen(str)+1), str); } //void print(ostream& os); void MyString::print(ostream& os) { if(!buf) return; //当buf=0的时候,直接结束 os<<buf->pointer()<<endl; //不为0,那么就输出内容 } int main() { MyString s("My test string"); s.print(cout); s.concat(" this is cutter_point"); s.print(cout); MyString s2; s2.concat("use default construct by cutter_point"); s2.print(cout); return 0; }
时间: 2024-10-24 08:00:02