You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++的main函数中声明并创建类的对象数组?

在C++中创建和使用类的对象数组

嘿,我来帮你搞定C++里类对象数组的创建和使用问题!下面分几种常见的场景给你详细说明,附带代码示例,一看就懂~

1. 静态对象数组(编译时确定大小)

如果你的数组大小在编译时就能确定,直接用静态数组就很方便。这里分两种情况:

情况1:类有默认构造函数

如果你的类定义了默认构造函数(无参或者全默认参数的构造),可以直接声明数组,编译器会自动调用默认构造初始化每个元素:

#include <iostream>
#include <string>

using namespace std;

class Person {
private:
    string name;
    int age;
public:
    // 默认构造函数
    Person() : name("Unknown"), age(0) {}
    // 带参数的构造函数
    Person(string n, int a) : name(n), age(a) {}
    
    void printInfo() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    // 创建包含3个Person对象的静态数组,自动调用默认构造
    Person people[3];
    
    // 遍历访问数组元素
    for (int i = 0; i < 3; ++i) {
        people[i].printInfo();
    }

    return 0;
}

情况2:类没有默认构造函数

如果你的类只定义了带参数的构造,没有默认构造,那必须用初始化列表显式初始化每个数组元素:

int main() {
    // 直接用带参数的构造函数初始化每个元素
    Person staff[] = {Person("Alice", 28), Person("Bob", 32), Person("Charlie", 25)};
    
    // 用范围for循环遍历(C++11及以上支持)
    for (auto& person : staff) {
        person.printInfo();
    }

    return 0;
}

⚠️ 注意:静态数组的大小必须是编译时常量,不能用运行时才确定的变量(比如int size = 5; Person people[size];是C++标准不允许的,部分编译器可能有扩展,但不推荐)。

2. 动态对象数组(运行时确定大小)

如果数组大小需要在运行时才能确定(比如根据用户输入决定),可以用new关键字创建动态数组:

int main() {
    int size;
    cout << "请输入人数:";
    cin >> size;

    // 动态分配size个Person对象,调用size次默认构造
    Person* people = new Person[size];

    // 给每个对象赋值(这里用带参数的构造创建临时对象赋值)
    for (int i = 0; i < size; ++i) {
        people[i] = Person("Person" + to_string(i), 20 + i);
    }

    // 输出每个对象的信息
    for (int i = 0; i < size; ++i) {
        people[i].printInfo();
    }

    // 必须用delete[]释放动态数组的内存,否则会内存泄漏!
    delete[] people;
    people = nullptr; // 将指针置空,避免野指针

    return 0;
}

⚠️ 重点:动态数组用完一定要用delete[]释放,不能用普通的delete,否则会导致未定义行为。另外,如果类没有默认构造函数,这种方式没法直接创建动态数组,这时候更推荐用下面的std::vector。

3. 现代C++:使用std::vector(强烈推荐)

如果你不是必须用原生数组,优先用std::vector!它是C++标准库提供的动态数组容器,自动管理内存,支持动态扩容,不管类有没有默认构造都能轻松初始化:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// 还是用之前的Person类(这里故意不写默认构造)
class Person {
private:
    string name;
    int age;
public:
    Person(string n, int a) : name(n), age(a) {} 
    
    void printInfo() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    // 方式1:空vector,逐个添加元素(用emplace_back直接构造,更高效)
    vector<Person> people;
    people.emplace_back("Alice", 28);
    people.emplace_back("Bob", 32);
    people.push_back(Person("Charlie", 25)); // 也可以用push_back

    // 方式2:直接初始化vector的元素
    vector<Person> staff = {Person("Dave", 30), Person("Eve", 26)};

    // 遍历输出,用const引用避免拷贝
    for (const auto& person : people) {
        person.printInfo();
    }

    // vector会在生命周期结束时自动释放内存,不需要手动delete
    return 0;
}

std::vector的优势简直太多了:不用手动管理内存、支持动态添加/删除元素、有丰富的成员函数(比如size()获取长度、resize()调整大小),几乎在所有场景下都比原生数组更安全、更灵活。

关键总结

  • 静态数组适合编译时确定大小的场景,有默认构造直接声明,没有的话用初始化列表。
  • 动态数组适合运行时确定大小的场景,但要记得用delete[]释放内存,且要求类有默认构造。
  • 现代C++优先用std::vector,省心又安全。
  • 访问对象数组元素都是用数组名[索引]的方式,索引从0开始。

内容的提问来源于stack exchange,提问作者Tinashe Roxley Kagande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:30