[230521] C++ STL: string 类的简单实现
想起来腾讯一面,面试官上来先让我手撕 string 类,没绷住,当时也没及时补,现在补补。
class string
{
private:
char *_str;
size_t _size;
size_t _capacity;
public:
//有参构造函数
string(const char *str = "")
: _size(strlen(str)), _capacity(_size)
{
_str = new char[_capacity + 1];
strcpy(_str, str);
}
//拷贝构造函数
string(const string &str)
: _size(str._size), _capacity(str._capacity)
{
_str = new char[_capacity + 1];
strcpy(_str, str);
}
//析构函数
~string()
{
if(_str != nullptr)
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
}
}
知识补充
- sizeof/strlen/size
函数 | 性质 | 描述 |
---|---|---|
sizeof | 运算符,返回类型为 size_t,使用方法为 sizeof(expression) | 可以应用于任何数据类型,包括基本数据类型,如整数和浮点类型、指针类型,或复合数据类型,如 struct、union 等。 ==返回已分配的实际大小。==如果将相同的值作为输入传递给 sizeof()、strlen() 和 size(),那么 sizeof() 将给出一个比字符串长度高的值。 |
strlen | 库函数,原型为 int strlen(const char *str) | 接收一个指针为参数,在运行时遍历内存直至遍历到 NULL;应用于char类型的数组 |
size | 成员函数,str.size() | string类的成员函数 |
- sizeof 的使用
//sizeof是一个编译时运算符,在编译时源代码会转换为二进制代码
//故==运行时并不会执行expression==
int main(void)
{
int y;
int x = 11;
y = sizeof(x++); // value of x doesn't change
printf("%i %i", y, x); // prints 4 and 11
return (0);
}
//输出为:4 11
- strlen 的使用
char ch[] = {'g', 'e', 'e', 'k', 's', '\0'};
char str[] = "geeks";
char *str = "geeks";
- new 和 delete 一个数组的方式
char *arr = new char[size];
delete[] arr;
- **在类定义中,可以访问本类一个对象的私有成员吗?**嗯,可以的。