实现自己的 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
(~)
(~)
(~)
(~)
(~)
可以对照每个函数分析一边,加深理解。
网友评论