首页 > 代码库 > 【ThinkingInC++】38、选择重载还是默认参数

【ThinkingInC++】38、选择重载还是默认参数

头文件

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





【ThinkingInC++】38、选择重载还是默认参数