首页 > 试题广场 >

下面 C++ 代码的运行结果为() #include io

[单选题]
下面 C++ 代码的运行结果为()
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass() {
        std::cout << "Constructor" << std::endl;
    }

    MyClass(const MyClass&) {
        std::cout << "Copy Constructor" << std::endl;
    }

    ~MyClass() {
        std::cout << "Destructor" << std::endl;
    }
};

int main() {
    std::vector<MyClass> v;
    v.emplace_back();
    v.emplace_back();
    return 0;
}
  • Constructor
    Constructor
    Destructor
    Destructor
  • Constructor
    Copy Constructor
    Destructor
  • Constructor
    Copy Constructor
    Destructor
    Destructor
  • Constructor
    Constructor
    Copy Constructor
    Destructor
    Destructor
    Destructor

1. std::vector<MyClass> v;

  • 创建一个空的 std::vector<MyClass> 类型的容器 v。此时没有 MyClass 对象被创建。

2. v.emplace_back();

  • 调用 emplace_back 向 v 容器添加一个新的 MyClass 对象。
  • emplace_back 直接在 vector 的末尾构造一个对象,因此会调用 MyClass 的默认构造函数。
  • 结果:输出 Constructor,表示调用了 MyClass 的构造函数。

3. v.emplace_back();

  • 再次调用 emplace_back 向 v 容器添加另一个新的 MyClass 对象。
  • 同样会调用 MyClass 的默认构造函数。
  • 结果:输出 Constructor,表示又调用了一次构造函数。

4. std::vector 的内存管理:

  • std::vector 是一个动态数组,它会在需要时自动扩展大小。在这里,v 最初可能分配了一块较小的内存来容纳元素,但在容纳两个对象之后,它可能会重新分配一块更大的内存区域以容纳更多元素。
  • 当 vector 扩展时,它会将现有元素复制到新内存区域。如果 vector 的容量增加,它可能会通过 移动 或 复制 对象来完成这一步骤。在这个例子中,std::vector 是通过复制构造函数来处理元素的。

5. Copy Constructor:

  • 由于 std::vector 的大小扩展,内部可能会发生元素的复制。在添加第二个元素时,std::vector 可能会将已经存在的对象复制到新的内存位置。
  • 因此,MyClass 的 拷贝构造函数 会被调用。
  • 结果:输出 Copy Constructor,表示发生了拷贝构造。

6. return 0; 和作用域结束:

  • 程序结束时,v 超出作用域,vector 被销毁。
  • 当 vector 被销毁时,它会自动销毁其内部的每个元素。这些元素的析构函数将被依次调用。
  • 每个元素调用 ~MyClass() 析构函数。
  • 结果:输出 Destructor 三次,表示每个 MyClass 对象的析构函数被调用。
发表于 2025-07-29 22:09:07 回复(0)