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. HTML5之Canvas绘图实例——饼状图

    实现饼状分布画图(如下):调试环境:Firefox

  2. 转:Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)

    Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...

  3. CSS3之Flexbox布局

    CSS3为我们提供了一种可伸缩的灵活的web页面布局方式-flexbox布局,它具有很强大的功能,可以很轻松实现很多复杂布局,在它出现之前,我们经常使用的布局方式是浮动或者固定宽度+百分比来进行布局, ...

  4. IOS:被误解的MVC和被神化的MVVM

    MVC的历史 MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写.它表示的是一种常见的客户端软件开发框架. ...

  5. 高效能团队协作的JIRA实践

    http://www.csdn.net/article/2015-05-21/2824739?utm_source=tuicool 高效能团队是企业生存和发展的基石.任何企业面对当下的激烈竞争,要想脱 ...

  6. ibats注意

    <isNotEqual property="id" compareValue="0" prepend="and">id=#id# ...

  7. [svn] linux 下svn服务器的搭建

    1. 下载svn(subversion) yum install subversion 2.查看svn位置(其实看不看都无所谓) 3.创建svn版本库目录 svnadmin create /home/ ...

  8. [tomcat] tomcat+nginx 负载均衡配置

    首先下载,安装tomcat. 修改tomcat端口,修改server.xml: 1.修改tomcat端口(默认8080) <Connector port="8383" pro ...

  9. smarty变量

    前台: 注释的两种方式:<{**}>和<!--注释html代码-->比如: <{* <div style="width:100px; height:100 ...

  10. Redis启动警告错误解决

    启动错误 (1)WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxc ...