13.44:编写标准库string类的简化版本,命名为String。你的类应该至少有一个默认构造函数和一个接受C

风格字符串指针参数的构造函数。使用allocator为你的String类分配所需内存

String.h头文件

#pragma once
#include<memory>
#include<iostream>
using namespace std; class String
{
friend ostream& operator<<(ostream& os, String &str)//运算符重载,实现输出
{
auto beg = str.elements;
for (;beg != str.first_free;)
os << *(beg++);
return os;
}
public:
String() :elements(nullptr), first_free(nullptr), cap(nullptr) {} // 默认构造函数,得到一个空字符串
String(char* chptr); //C风格字符串指针参数的构造函数
void free(); //析构函数的辅助函数
~String(); //析构函数,因为用了allocator,必须要定义析构函数
private:
allocator<char> alloc;
char* elements; //指向字符串首元素的指针
char* first_free; //指向字符串尾元素之后的指针
char* cap; //指向尾后位置的指针
}; String::String(char *chptr)
{
size_t len = ;
for (char *ch = chptr;'\0' != *ch;++ch, ++len);//得到字符串的长度
elements=alloc.allocate(len); //分配一个长的为len的空间
first_free = elements;
for (size_t i = ;i < len;++i) //将元素构造到港分配的空间中去
{
alloc.construct(first_free++, *(chptr++));
}
cap = first_free;
} void String::free()
{
if (elements) //不能传递给deallocate一个空指针
{
size_t len = cap - elements;
for (;first_free != elements;) //逆序销毁旧元素
alloc.destroy(--first_free);
alloc.deallocate(elements, len);
}
} String::~String()
{
free();
}

主函数验证

// 13_44.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include"String.h"
#include<iostream>
using namespace std; int main()
{
String str0,str1("haha");
cout << str0 << "\n" << str1 << endl;
return ;
}

C++primer 练习13.44的更多相关文章

  1. C++primer 练习13.39

    13.39 编写你自己版本的StrVec,包括自己版本的reserve,capacity(参见9.4节,第318页)和resize(参见9.3.5节,第314页) 13.40 为你的StrVec类添加 ...

  2. noi.openjudge 1.13.44

    http://noi.openjudge.cn/ch0113/44/ 总时间限制:  1000ms 内存限制:  65536kB 描述 将 p 进制 n 转换为 q 进制.p 和 q 的取值范围为[2 ...

  3. 【C++ Primer 第13章】2. 拷贝控制和资源管理

    拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个 ...

  4. 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁

    拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...

  5. 【C++ Primer 第13章】3. 交换操作

    交换操作 class HasPtr { friend void swap(HasPtr &rhs, HasPtr &yhs); //其他成员定义 }; void swap(HasPtr ...

  6. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  7. C++ primer chapter 13

    拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...

  8. C++primer练习14.44

    编写一个简单的桌面计算器使其处理二元运算 // 14_44.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iost ...

  9. C++primer 练习13.36

    #pragma once #include<string> #include<set> using namespace std; class Message { friend ...

随机推荐

  1. android虚拟机(ROOT)权限

    自己找的一个比较好用的pc端安卓模拟器,蓝手指总所周知吧,这个是较高版本但不是最新的一个版本,关键是自带root功能,对于破解安卓存档类游戏还是有用的.安卓版本4.4.2 BlueStacks 0.9 ...

  2. ASP.NET MVC 页面调整并传递参数

    转自:http://blog.csdn.net/zhensoft163/article/details/7174661 使用过ASP.NET MVC的人都知道在MVC中页面后台中常用的页面跳转方法有几 ...

  3. 百度ueditor学习使用

    1.下载ueditor解压 2. jsp里存放着开发所用到的jar包,导入项目即可 前端页面代码如下: <center> <form action="" meth ...

  4. bootstrapDialog插件集成datatables插件遇到的异常

    最近项目中,涉及到很多细分领域的东西,有好些目前还没有详细的方案.这是后话,当前起步阶段,我要把握技术路线,搭建基础架构!其中,有好几个地方都用到模态框(Modal), 虽然Bootstrap框架里面 ...

  5. 不包含适合于入口点的静态"Main"方法

    学习新建项目.此问题做为笔记. 错误 1 程序“admin.exe”不包含适合于入口点的静态“Main”方法 原因:原来创建项目的时候,用的是“空项目”,我以为这样就会生成类库,实际上,一开始准备运行 ...

  6. 遇到 Error creating the Web Proxy specified in the 'system.net/defaultProxy' configuration section的解决办法

    用记事本编辑*.EXE.config,在“<system.net>”节点加入<defaultProxy> <proxy usesystemdefault="Fa ...

  7. SPOJ #692. Fruit Farm

    Another palindrome related problem. Actually nothing too theoretical here, but please keep following ...

  8. Nginx做反向代理总是被系统kill

    公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux ...

  9. Linux的软连接与硬链接

    Linux的软连接相当于window系统的快捷方式,如我们桌面的QQ等. 硬连接相当于复制一个文件,但不同的是两个文件内容同步.如创建一个文件A的硬连接B, 如果我修改A里面的内容,同时B中的内容也会 ...

  10. strong标签与b标签的区别

    关于html标签中b和strong两个的区别. 用在网页上,默认情况下它们起的均是加粗字体的作用,二者所不同的是,<b>标签是一个实体标签,它所包围的字符将被设为bold(粗体),而< ...