自分のmyを叶えてstring

3646 ワード

自分のmyを叶えてstring
本文はcheng-zhiのオリジナルの文章で、勝手に転載することができて、しかし必ず明確な位置で出典を明記しなければなりません!
my_string.h
私たちはよくC++std::stringタイプを使用しています.このタイプの基本的な実装原理を理解し、C++の文法をよりよく理解するのに役立ちます.以下は簡単なstd::stringの基本的な簡単な実現であり、興味のある人は自分で実践することができる.
#ifndef _MY_STRING_H
#define _MY_STRING_H

#include 
#include 
#include 
#include 

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 

#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

(~)
(~)
(~)
(~)
(~)

各関数を分析しながら、理解を深めることができます.
テキストアドレス