一、对象数组概述
C++ 对象数组是一个数组,其中的元素是类的对象。与基本数据类型数组(如整数数组、浮点数数组)不同,对象数组中的每个元素都是一个类的实例。因此,对象数组在创建时会调用对象的构造函数,而在销毁时会调用对象的析构函数。
二、对象数组定义与使用
定义一个一维对象数组的格式
类名 数组名[下标表达式]
使用一维对象数组的一般格式
数组名[下标].成员名
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数
Person(std::string newName = "Unknown", int newAge = 0) : name(newName), age(newAge) {
std::cout << "Constructor called for " << name << std::endl;
}
// 析构函数
~Person() {
std::cout << "Destructor called for " << name << std::endl;
}
// 打印个人信息的成员函数
void printInfo() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
// 创建一个包含 3 个 Person 对象的数组
Person people[3] = {
Person("Alice", 30),
Person("Bob", 25),
Person("Charlie", 20)
};
// 打印每个对象的信息
for (int i = 0; i < 3; ++i) {
people[i].printInfo();
}
// 数组超出作用域时,每个对象的析构函数会自动被调用
return 0;
}
在这个示例中,我们定义了一个 Person
类,并为其提供了一个带有默认参数的构造函数和一个析构函数。然后,我们在 main()
函数中创建了一个包含 3 个 Person
对象的数组 people
。
三、创建对象数组的步骤
- 定义类:首先定义一个类,如示例中的
Person
类。 - 声明数组:声明一个类对象的数组。例如,
Person people[3];
创建了一个包含 3 个Person
对象的数组。 - 初始化数组:可以在声明数组时使用初始化列表来初始化每个对象,如
Person people[3] = { Person("Alice", 30), Person("Bob", 25), Person("Charlie", 20) };
。 - 使用对象:可以使用数组中的对象,就像使用普通数组元素一样。例如,
people[i].printInfo();
。
四、给对象数组赋值
示例分别使用不带参数的构造函数,带一个参数的构造函数,带有多个参数的构造函数给对象数组赋值:
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 不带参数的构造函数
Person() : name("Unknown"), age(0) {
std::cout << "Default constructor called for " << name << std::endl;
}
// 带一个参数的构造函数
Person(std::string newName) : name(newName), age(0) {
std::cout << "Constructor with one parameter called for " << name << std::endl;
}
// 带多个参数的构造函数
Person(std::string newName, int newAge) : name(newName), age(newAge) {
std::cout << "Constructor with two parameters called for " << name << std::endl;
}
// 打印个人信息的成员函数
void printInfo() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
// 创建一个包含 3 个 Person 对象的数组
// 使用不同的构造函数初始化每个对象
Person people[3] = {
Person(), // 使用不带参数的构造函数
Person("Alice"), // 使用带一个参数的构造函数
Person("Bob", 25) // 使用带多个参数的构造函数
};
// 打印每个对象的信息
for (int i = 0; i < 3; ++i) {
people[i].printInfo();
}
// 数组超出作用域时,每个对象的析构函数会自动被调用
return 0;
}
说明:
-
不带参数的构造函数:
Person()
用于初始化没有提供参数的对象,默认将name
设置为"Unknown"
,age
设置为0
。 -
带一个参数的构造函数:
Person(std::string newName)
用于初始化提供了一个参数的对象,将name
设置为newName
,age
设置为0
。 -
带多个参数的构造函数:
Person(std::string newName, int newAge)
用于初始化提供了两个参数的对象,将name
设置为newName
,age
设置为newAge
。
输出代码
Default constructor called for Unknown
Constructor with one parameter called for Alice
Constructor with two parameters called for Bob
Name: Unknown, Age: 0
Name: Alice, Age: 0
Name: Bob, Age: 25