C++中的对象数组详细解析
什么是对象数组
对象数组是指由多个相同类型的对象依次排列组成的数组。在 C++ 中,一个对象数组一旦被定义,就会在内存中分配相应的空间,同时数组名也被定义为一个指向该数组首元素的指针。
定义一个对象数组示例:
class Person {
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
int main() {
Person persons[3] = {{"Tom", 20}, {"Jerry", 18}, {"Maggie", 22}};
return 0;
}
上面的代码中,Person 类表示一个人,包含姓名和年龄两个属性。在 main 函数中,我们定义了一个 Person 类型的对象数组 persons,并初始化了数组中的3个元素。
对象数组的默认构造函数和拷贝构造函数
当对象数组被定义后,如果该类没有显式定义无参构造函数,则会调用默认构造函数进行初始化。如果该类有显式定义一个或多个有参构造函数,则默认构造函数不会被编译器生成。
示例代码:
class Student {
public:
string name;
int age;
Student(string name, int age) {
this->name = name;
this->age = age;
cout << "有参构造函数" << endl;
}
};
int main() {
Student students[3];
return 0;
}
上述代码定义了一个 Student 对象数组,由于 Student 类中没有显式定义无参构造函数,所以将调用默认构造函数。编译后运行该程序,结果是:
error: no matching constructor for initialization of 'Student'
Student students[3];
^
note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
class Student {
^~~~~~~
note: candidate constructor not viable: requires 2 arguments, but 0 were provided
Student(string name, int age) {
^
可以看到编译器报错,因为 Student 类中没有显式定义无参构造函数。
另外,当对象数组中的元素需要进行拷贝初始化时,会调用该类的拷贝构造函数。如果该类没有显式定义拷贝构造函数,编译器会生成默认的拷贝构造函数,该函数是将对象的成员变量逐个拷贝到新的对象中。
示例代码:
class Teacher {
public:
string name;
int age;
Teacher() {}
Teacher(Teacher &t) {
this->name = t.name;
this->age = t.age;
cout << "拷贝构造函数" << endl;
}
};
int main() {
Teacher t("Lucy", 30);
Teacher teachers[3] = {t, t, t};
return 0;
}
上述代码对 Teacher 类显式定义了一个拷贝构造函数,用来进行对象数组的拷贝初始化。编译后运行该程序,结果是:
拷贝构造函数
拷贝构造函数
可以看到,每次新建一个对象时,都会调用一次拷贝构造函数。
对象数组的访问方式
对象数组的元素可以按照下标访问,也可以通过指向对象数组元素的指针进行访问。
下标访问示例代码:
class Animal {
public:
string name;
int age;
Animal(string name, int age) {
this->name = name;
this->age = age;
}
};
int main() {
Animal animals[3] = {{"Cat", 2}, {"Dog", 1}, {"Fish", 3}};
for(int i=0; i<3; i++) {
cout << "Animal " << i+1 << " Name: " << animals[i].name << ", Age: " << animals[i].age << endl;
}
return 0;
}
指针访问示例代码:
class Car {
public:
string name;
int price;
Car(string name, int price) {
this->name = name;
this->price = price;
}
};
int main() {
Car cars[3] = {{"BMW", 500000}, {"Audi", 400000}, {"Benz", 600000}};
Car *pCar = cars;
for(int i=0; i<3; i++) {
cout << "Car " << i+1 << " Name: " << (pCar+i)->name << ", Price: " << (pCar+i)->price << endl;
}
return 0;
}
上述代码中,首先定义了一个 Car 类,表示一种汽车,包括名称和价格。然后定义了一个 Car 对象数组 cars,并通过指针 pCar 指向了数组的首元素。通过指针 pCar 来访问对象数组 cars 中的元素。
总结
本文介绍了 C++ 中的对象数组,包括对象数组的定义、默认构造函数、拷贝构造函数以及对象数组的访问方式等内容。通过本文的学习,相信读者能够更好地掌握 C++ 类及对象的相关知识,进一步提高编程水平。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的对象数组详细解析 - Python技术站