如何在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
相关产品推荐
相关产品推荐

