zoukankan      html  css  js  c++  java
  • C++primer 练习13.44

    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 = 0;
        for (char *ch = chptr;'' != *ch;++ch, ++len);//得到字符串的长度
        elements=alloc.allocate(len);                  //分配一个长的为len的空间
        first_free = elements;
        for (size_t i = 0;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 << "
    " << str1 << endl;
        return 0;
    }
  • 相关阅读:
    【转】构建高并发高可用的电商平台架构实践
    【转】深入解析浏览器的幕后工作原理
    【转】解释器,树遍历解释器,基于栈与基于寄存器
    EasyDarwin返回401 Unauthorized解决方法
    【转】SDP file
    音频PCM格式
    H264相关知识
    testNG之异常测试
    testNG之组测试
    testNG之顺序执行
  • 原文地址:https://www.cnblogs.com/csudanli/p/5388604.html
Copyright © 2011-2022 走看看