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

最新文章

  1. 【AI开发第一步】微软认知服务API应用
  2. js内存泄露的几种情况
  3. 纯css3圆角下拉菜单 都没敢用js
  4. javascript 特殊的一些知识
  5. Silverlight中嵌套html、swf、pdf
  6. eclipse 中修改 M2_REPO的值--转载
  7. basicAnimation移动图形
  8. Android放大镜的实现
  9. UIBezierPath和CAShapeLayer的关系
  10. DEDE常见问题(转)
  11. Hibernate学习之createSQLQuery与createQuery的区别及使用
  12. 当 C++ 遇上音乐
  13. java根据图片创建日期,或最后修改日期重命名
  14. ASP.NET MVC+BUI实现表格的操作
  15. ROM、RAM、DRAM、SRAM和FLASH、PSRAM
  16. 移动前端框架,require.js压缩
  17. 如何用 async 控制流程
  18. linux:SSH最简单教程
  19. HDU 2086 A=? 数学题
  20. jenkins - svn: E170001报错的原因以及解决方案

热门文章

  1. git提交代码到本地仓库和远程仓库
  2. ArcGIS 10 影像、栅格数据格式批量转换
  3. Linux中删除文件,磁盘空间未释放问题追踪
  4. Flume Channel Selectors官网剖析(博主推荐)
  5. python相关系数
  6. 详解javascript的深拷贝与浅拷贝
  7. 策略模式 VS 桥梁模式
  8. Altium Designer如何统一调整标号大小,在pcb环境下
  9. JS学习笔记 - fgm练习 - 多按钮控制同个div属性
  10. mybatis-generator使用