头文件
/**
* 书本:【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;
}