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. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) Note 这一章节的内容是基于 Scott Gonzalez 一篇博客 Building ...

  2. Jquery获得下拉框的值

    转自:http://blog.csdn.net/jing_xin/article/details/8007794 获取Select : 获取select 选中的 text : $("#ddl ...

  3. ASP.NET MVC 控制器向View传值的三种方法

    转自:http://www.cnblogs.com/shinima/p/3940452.html 1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResu ...

  4. 通过批处理文件启动oracle11g服务

    注:ORCL是数据库实例名,默认的数据库是ORCL,你可以创建其他的,即OracleService+数据库名. ========================================启动服务 ...

  5. Python基础教程【读书笔记】 - 2016/6/26

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第一波:第6章  抽象 [总览] 介绍函数.参数parameter.作用于scope概念,以及递归概念. [6.1] 函 ...

  6. 剑指offer系列58---把数组排成最小的数

    [题目]输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.[思路]1 ...

  7. Winfrom DateGridView 实现Button列禁用

    Form窗体如下所示: 实现如下: using System; using System.Collections.Generic; using System.Drawing; using System ...

  8. cf 645F Cowslip Collections 组合数学 + 简单数论

    http://codeforces.com/contest/645/problem/F F. Cowslip Collections time limit per test 8 seconds mem ...

  9. NeHe OpenGL教程 第二十六课:反射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. centos6配置远程桌面,使用xmanager访问

    现在linux的图形界面越来越丰富,使用图形界面操作也逐渐成为使用者的一种习惯.在我们安装文件的过程中,经常会应用得到. 比如远程安装oracle,或者有多台主机.避免在不同主机间切换显示器. 1.检 ...