自分のmyを叶えてstring
3646 ワード
自分のmyを叶えてstring
本文はcheng-zhiのオリジナルの文章で、勝手に転載することができて、しかし必ず明確な位置で出典を明記しなければなりません!
my_string.h
私たちはよく
my_string.cpp
次のコマンドを使用して実行をコンパイルする必要があります.
実行結果:
各関数を分析しながら、理解を深めることができます.
テキストアドレス
本文は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
(~)
(~)
(~)
(~)
(~)
各関数を分析しながら、理解を深めることができます.
テキストアドレス