Menu
CoddyTech

复习:String 类

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 26 课,共 104 课。

challenge icon

挑战

简单

我们来构建一个完整的 String 类,让它管理自己的动态字符数组,并综合运用本章介绍的所有构造函数和析构函数概念。这是一个经典练习,可以模拟 std::string 的内部工作方式。

你将创建两个文件来组织代码:

  • String.h:按照五法则定义 String 类。你的类应管理一个名为 data 的 char* 指针和一个 size_t length 成员。实现以下内容:
    • 一个默认构造函数,用于创建空字符串(为字符串结尾的空字符分配一个字符的空间,并将 length 设为 0)。打印 "Default constructed"
    • 一个带参数的构造函数,接收一个 const char*,并将 C 字符串复制到新分配的内存中。打印 "Constructed: <text>"
    • 一个复制构造函数,用于对另一个 String 执行深拷贝。打印 "Copied: <text>"
    • 一个移动构造函数(标记为 noexcept),用于转移所有权。在将源对象置空之前,使用文本打印 "Moved: <text>"
    • 一个析构函数,用于安全地释放内存(检查指针是否为空)。打印 "Destroyed: <text>"(如果 data 为空或 length 为 0,则打印 "Destroyed: (empty)")
    • 一个返回长度的 size() 方法
    • 一个返回字符指针的 c_str() 方法(如果指针为空,则返回 "")
  • main.cpp:演示所有构造函数如何协同工作。从输入中读取一个文本字符串,然后:
    • 使用默认构造函数创建一个名为 s1 的 String
    • 使用输入文本创建一个名为 s2 的 String
    • 通过复制 s2 创建一个名为 s3 的 String
    • 通过移动 s2 创建一个名为 s4 的 String
    • 打印 "--- Status ---"
    • 对于每个字符串(s1 到 s4),打印 "s<n>: \"<text>\" (length: <len>)"

为了提高效率,请在所有构造函数中使用成员初始化列表。移动后,s2 应为空,长度为 0,而 s4 应保留原始文本。最后的析构函数消息会显示这四个对象按照创建顺序的逆序依次清理。

包含 <cstring> 以使用 strlen 和 strcpy,并包含 <utility> 以使用 std::move()。别忘了在头文件中添加头文件保护。

亲手试试

#include <iostream>
#include <string>
#include "String.h"

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: 使用默认构造函数创建 String s1

    // TODO: 使用输入文本创建 String s2

    // TODO: 复制 s2 来创建 String s3

    // TODO: 从 s2 移动数据来创建 String s4(使用 std::move)

    // 输出状态标题
    cout << "--- Status ---" << endl;

    // TODO: 输出 s1 到 s4 每个字符串的状态
    // 格式:"s<n>: \"<text>\" (length: <len>)"

    return 0;
}

面向对象编程中的所有课

自己练习: C++ 在线编译器