美文网首页
实现自己的 my_string

实现自己的 my_string

作者: 登龙zZ | 来源:发表于2017-05-17 18:03 被阅读0次

    实现自己的 my_string


    版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明确位置注明出处!

    my_string.h

    我们经常在 C++ 中使用 std::string 类型,我们应该了解这个类型的基本实现原理,帮助我们更好的理解 C++ 的语法。下面是一段简单的 std::string 的基本简单实现,有兴趣的可以自己实践下。

    #ifndef _MY_STRING_H
    #define _MY_STRING_H
    
    #include <iostream>
    #include <utility>
    #include <assert.h>
    #include <string.h>
    
    namespace MyStringSpaceOne {
    
    /*
     * A string for write-on-paper in an interview.
     */
    class String 
    {
    public:
        /* 默认构造函数 */
        String() : data(new char[1])
        {
            std::cout << "()" << std::endl;
            *data = '\0';
        }
        /* 带有字符串指针的构造函数 */
        String(const char* str) : data(new char[strlen(str) + 1])
        {
            std::cout << "(*)" << std::endl;
            strcpy(data, str);      
        }
        /* copy 构造函数 */
        String(const String& rhs) : data(new char[rhs.size() + 1])
        {
            std::cout << "(&)" << std::endl;
            strcpy(data, rhs.c_str());
        }
        
        /* noexcept : this fun don`t throw exception */
        ~String() noexcept
        {
            std::cout << "(~)" << std::endl;
            delete [] data;
        }
        
        /* 赋值操作符 */
        String& operator=(String rhs)
        {
            std::cout << "(=)" << std::endl;
            swap(rhs);
            return *this;
        }
        
        /* C++11 移动构造函数 */
        String(String&& rhs) noexcept : data(rhs.data)
        {
            std::cout << "(move)" << std::endl;
            rhs.data = nullptr;
        }
        
        /* 获取 string 的长度 */
        size_t size() const 
        {
            return strlen(data);
        }
        
        /* 获取 string 的 C 字符串 */
        const char* c_str() const
        {
            return data;
        }
        
        /* 给移动构造函数调用的 swap 函数 */
        void swap(String& rhs)
        {
            std::cout << "swap" << std::endl;
            std::swap(data, rhs.data);
        }
    
    
    private:
        /* 存储字符串的指针 */
        char *data;
    
    };
    
    };
    
    #endif //MY_STRING_H
    

    my_string.cpp

    #include <iostream>
    
    #include "my_string.h"
    
    
    void print_string(const MyStringSpaceOne::String& str)
    {
        if (nullptr == str.c_str())
        {
            std::cout << "c_str: nullptr" << std::endl;
            std::cout << "length: 0" << std::endl;
        }
        else 
        {
            std::cout << "c_str: "  << str.c_str() << std::endl;
            std::cout << "length: " << str.size()  << std::endl;
        }
    
        std::cout << std::endl;
    }
    
    
    
    int main(void)
    {
        const char pstr[] = "hello world";
        
        // 调用默认构造函数
        MyStringSpaceOne::String s1;    
        print_string(s1);
        
        // 调用带有字符串指针的构造函数
        MyStringSpaceOne::String s2(pstr);
        print_string(s2);
    
        //调用 copy 构造函数
        MyStringSpaceOne::String s3(s2);    
        print_string(s3);
    
        // 调用赋值操作符
        MyStringSpaceOne::String s4;
        s4 = s2;    
        print_string(s4);
    
        // 调用移动构造函数
        MyStringSpaceOne::String s5 = std::move(s4);    
        print_string(s5);
        print_string(s4);
    
        return 0;
    }
    

    你需要使用下面的命令编译运行:

    gcc my_string.cpp -std=c++11
    ./a.out
    

    运行结果:

    ()
    c_str: 
    length: 0
    
    (*)
    c_str: hello world
    length: 11
    
    (&)
    c_str: hello world
    length: 11
    
    ()
    (&)
    (=)
    swap
    (~)
    c_str: hello world
    length: 11
    
    (move)
    c_str: hello world
    length: 11
    
    c_str: nullptr
    length: 0
    
    (~)
    (~)
    (~)
    (~)
    (~)
    

    可以对照每个函数分析一边,加深理解。

    原文地址

    相关文章

      网友评论

          本文标题:实现自己的 my_string

          本文链接:https://www.haomeiwen.com/subject/gjadxxtx.html