跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. SubForums
  3. 现代C++ | mcpp论坛
  4. 关于学习C++中的int main中new一个新的伐对象的困惑

关于学习C++中的int main中new一个新的伐对象的困惑

已定时 已固定 已锁定 已移动 已解决 现代C++ | mcpp论坛
疑问
3 帖子 2 发布者 26 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • g202080272G 离线
    g202080272G 离线
    g202080272
    编写于 最后由 编辑
    #1

    各位大神,你们好,我是刚刚接触代码的新人,这是我关于在C++学习过程中遇到的一点小的疑惑
    我利用AI出了一道题目以便于我的学习和知识掌握情况。
    尽管我利用百度和AI的解答,我始终不是很明白为什么要会有这一行代码 EBook digital_book = new EBook("A Brief History of Time", 2048);*
    题目内容是:你的任务是编写一个完整的C++程序,包含两个类和一个main函数,来模拟图书的入库和销毁过程。
    以下是我的代码```
    code_text
    #include <iostream>
    #include <string>

    // --- 基类 ---
    class Book {
    public:
    std::string title;
    Book(std::string n) : title(n) {
    std::cout << "Book: " << title << " has been published." << std::endl;
    }
    ~Book() {
    std::cout << "Book: " << title << " has been archived." << std::endl;
    }
    };

    // --- 派生类 ---
    class EBook : public Book {
    public:
    int* file_size_kb;
    // 构造函数修正
    EBook(std::string n, int size) : Book(n) {
    file_size_kb = new int(size);
    std::cout << "EBook: " << title << " has been digitized." << std::endl;
    }
    ~EBook() {
    std::cout << "EBook: " << title << "'s digital file has been erased." << std::endl;
    delete file_size_kb;
    }
    };

    // --- main函数修正 ---
    int main() {
    std::cout << "--- Library Opening ---" << std::endl;
    Book paper_book("The Lord of the Rings");
    EBook* digital_book = new EBook("A Brief History of Time", 2048);
    std::cout << "--- Library is operating ---" << std::endl;
    delete digital_book;
    std::cout << "--- Library Closing ---" << std::endl;
    return 0;
    }

    sunrisepeakS 1 条回复 最后回复
    0
    • sunrisepeakS 离线
      sunrisepeakS 离线
      sunrisepeak d2learn-dev
      回复了g202080272 最后由 编辑
      #2

      @g202080272 在 关于学习C++中的int main中new一个新的伐对象的困惑 中说:

      Book paper_book("The Lord of the Rings");
      EBook* digital_book = new EBook("A Brief History of Time", 2048);
      std::cout << "--- Library is operating ---" << std::endl;
      delete digital_book;

      通过new创建的对象为动态内存分配的对象, 程序员将获得对象生命周期控制权, 例如后面可以使用delete去删除结束对象生命 - 即掌握了创建和销毁的控制权

      而对比paper_book的生命周期是由 编译器/作用域 来自动控制的

      两种对比

      • new/delete 动态分配对象: 程序员 将拥有该对象的生命周期控制权力, 且有责任管理好其生命周期
        • 优点: 更大的生命周期控制权
        • 缺点: 如果没有控制好, 如忘记释放 将会内存泄漏
      • 编译器 / 栈对象: 生命周期由编译期自动处理 (作用域)
        • 优点: 更低的心智负担, 不用担心释放问题
        • 缺点: 程序员无法自由控制生命周期的结束

      核心概念: 获得更大权力, 对应需要承担更大的责任

      g202080272G 1 条回复 最后回复
      1
      • g202080272G 离线
        g202080272G 离线
        g202080272
        回复了sunrisepeak 最后由 编辑
        #3

        @sunrisepeak 谢谢。我已经理解了

        1 条回复 最后回复
        0
        • ,sunrisepeakS sunrisepeak 将这个主题转为问答主题
        • ,sunrisepeakS sunrisepeak 将这个主题标记为已解决

        • 登录

        • 没有帐号? 注册

        • 登录或注册以进行搜索。
        d2learn forums Powered by NodeBB
        • 第一个帖子
          最后一个帖子
        0
        • 版块
        • 最新
        • 标签
        • 热门
        • Online Tools
        • 用户
        • 群组