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. VB的if和elseif

    VB中if和elseif的用法是: if...then...elseif...then...else...endif 切记在then的后面不要加冒号,加了冒号出现else没有if的错误,因为加了冒号表 ...

  2. [你必须知道的.NET]第一回:恩怨情仇:is和as

    本文将介绍以下内 容: • 类型转换 • is/as操作符小议 1. 引言 类型安全是.NET设计之初重点考虑 的内容之一,对于程序设计者来说,完全把握系统数据的类型安全,经常是力不从心的问题.现在, ...

  3. serialVersionUID 的用途--转加自己的疑问

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  4. mvn 命令

    mvn eclipse:eclipse  用mvn把文件转化成eclipse支持的文件 mvn install   打包jar,放到本地仓库 ,在打包的时候还会执行单元测试,不需要的话运行(不需要打入 ...

  5. nginx ssi 配置小细节(一)

    最近工作需要使用nginx的ssi (server side include)技术,在这里,将使用中的一点心得分享一下,也是一种备忘! 首先,nginx的ssi启用很简单,就只有三个最基本的指令: s ...

  6. Func系列4:其他功能

    非Python API接口支持 Func通过非Python API实现远程调用,目的是为第三方工具提供调用及返回接口.Func使用func-transmit命令来实现,支持YAML.JSON格式,实现 ...

  7. Python 创建函数和代码重用

    1. cat func.py #!/usr/bin/python def func(): print "hello,this is a function" def func2(): ...

  8. C语言每日一题之No.7

    今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...

  9. 【MySQL】原理 之 事务

    1.MySQL逻辑架构大致分为:连接认证层,核心服务层,存储引擎层. 2.锁策略,需要在开销和数据的安全性之间寻求平衡,这种平衡会影响到性能. 3.写锁优先于读锁. 4.行级锁只在存储引擎层实现,而M ...

  10. JMM & synchronized概述(转)

    根据Java语言规范中的说明,JVM系统中存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,对于所有的线程是共享的(相当于黑板,其他人都可以看到的).每个线程都有自己的工作 ...