C++中的对象数组详细解析

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技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言快速实现扫雷小游戏

    C语言快速实现扫雷小游戏攻略 介绍 扫雷是一款经典的小游戏,以其简单的规则和极高的可玩性深受玩家喜爱。在此,将介绍如何使用C语言快速实现扫雷小游戏。 实现思路 扫雷游戏的主要逻辑是实现格子的打开、插旗和计算数字等操作。因此需要设计一个二维数组来表示游戏界面,并将每个格子分成以下几种类型: 雷格:表示该格子下面是一颗地雷; 数字格:表示该格子周围有多少颗地雷;…

    C 2023年5月23日
    00
  • 关于C++友元函数的实现讲解

    关于C++友元函数的实现讲解 C++中的友元函数能够访问一个类的私有成员和保护成员,但不属于该类,也不是该类的成员函数,需要在类定义之外单独进行声明和定义。 友元函数的声明 友元函数的声明需在类的定义之外进行,并在函数名之前加上friend关键字。示例代码如下: class A { friend void B::function(A&); } 在上述…

    C 2023年5月23日
    00
  • C语言预处理预编译命令及宏定义详解

    C语言预处理预编译命令及宏定义详解 C语言中有一种预处理器,可以利用预处理指令在编译之前进行文本替换、宏定义、条件编译等操作,这种预处理器就是C语言预处理器。本文将介绍C语言预处理器的使用方法和一些常见的预处理命令及宏定义的详解。 预处理命令 C语言预处理器使用一些特殊的指令进行预处理,下面列举了一些常见的预处理命令: include #include &l…

    C 2023年5月23日
    00
  • C++分析讲解类的静态成员函数如何使用

    当我们需要为一个类定义一个在全局范围内使用的函数时,我们可以使用类的静态成员函数。静态成员函数只能访问静态成员变量,它们没有this指针,所以无法访问非静态成员变量、函数和成员变量的this指针。在C++中,静态成员函数前面加上static关键字即可将其设置为静态成员函数。 如何声明定义静态成员函数 我们可以将静态成员函数声明为public、protecte…

    C 2023年5月23日
    00
  • C++消息队列(定义,结构,如何创建,发送与接收)

    下面是C++消息队列的完整攻略。 定义 C++消息队列是一种多线程之间通讯的方式,其实现了线程之间的异步通信机制。消息队列基于先进先出的原则,消息发送者将消息依次放入消息队列的尾部,消息接收者从队列的头部依次取出消息进行处理。 结构 消息队列的结构一般分为三个部分: 队列存储空间:为消息存储提供空间。 发送者:将消息放入队列中。 接收者:从队列中取出消息进行…

    C 2023年5月23日
    00
  • C语言 strspn()函数

    当我们需要检测两个字符串之间共有的字符时,可以使用C语言的strspn()函数。该函数返回字符串中的字符数目,直到字符串中的第一个不属于目标字符集合的字符(即停止搜索的字符)被检测到。以下是关于该函数的详细使用攻略。 函数原型 size_t strspn(const char *str1, const char *str2); 该函数接受两个参数:str1和…

    C 2023年5月9日
    00
  • C语言中%c与%s的区别与划分详解

    C语言中%c与%s的区别与划分详解 在C语言中,%c和%s是格式化输出的常见控制字符,这两个字符在使用时有所不同。 %c的用法 %c表示输出一个字符,一般和变量类型char搭配使用。在使用%c输出时,必须提供一个字符型参数。 以下是一个示例: #include <stdio.h> int main() { char letter = ‘a’; p…

    C 2023年5月22日
    00
  • C语言实现打印星号图案

    关于C语言实现打印星号图案的攻略,我可以提供如下内容: 标题 C语言实现打印星号图案的完整攻略 代码块 #include <stdio.h> int main() { int i, j, n = 5; for(i = 1; i <= n; i++) { for(j = 1; j <= i; j++) { printf("* …

    C 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部