动态数组与静态数组,栈内存与堆内存,拷贝构造函数函数
时间: 2023-06-10 10:08:57 浏览: 106
动态数组和静态数组是两种不同类型的数组。静态数组是在编译时分配内存的数组,其大小在定义时就已经确定。动态数组则是在运行时分配内存的数组,其大小可以根据需要进行动态调整。
栈内存和堆内存是两种不同的内存分配方式。栈内存是由程序自动分配和释放的内存,其大小和生命周期是由程序控制的。堆内存则是由程序动态申请和释放的内存,其大小和生命周期可以在运行时根据需要进行调整。
拷贝构造函数是一种特殊的构造函数,用于创建一个新的对象并将其初始化为已有对象的副本。在 C++ 中,如果没有定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。但是,如果类中包含指针等动态分配的资源,需要手动实现拷贝构造函数来确保正确的拷贝。
相关问题
1、定义一个CAnimal类: 1)在该类中包含五个成员变量:一个是表示名称的string类型变量;另一个是表示出生日期的tm类型变量;还有一个表示类别的enum类型变量(比如:哺乳动物、爬行动物、两栖动物、鸟类等);表示产地的string类型变量;表示体重的静态变量;同时以不同的访问控制符加以区分; 2)定义合适的构造函数与拷贝构造函数; 3)实现不同类别动物数量、重量的统计与动物年龄实时计算(使用静态数组和静态变量成员); 4)使用内联函数为相应的成员变量设置接口; 5)实现对象信息的展示与输出(注意静态成员与非静态成员的区别); 6)在外部定义一个友元函数实现类中对象信息的展示与输出; 7)在main函数中定义CAnimal的10个实例,然后输出显示每一个实例的信息,同时输出相应的统计信息。
```cpp
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
// 定义动物类别的枚举类型
enum AnimalType {
Mammal, // 哺乳动物
Reptile, // 爬行动物
Amphibian, // 两栖动物
Bird // 鸟类
};
// 动物类
class CAnimal {
private:
string m_name; // 名称
tm m_birthday; // 出生日期
AnimalType m_type; // 类别
string m_origin; // 产地
static double s_weight; // 体重
public:
// 构造函数
CAnimal(string name, tm birthday, AnimalType type, string origin) :
m_name(name), m_birthday(birthday), m_type(type), m_origin(origin) {}
// 拷贝构造函数
CAnimal(const CAnimal& other) :
m_name(other.m_name), m_birthday(other.m_birthday), m_type(other.m_type), m_origin(other.m_origin) {}
// 设置名称
inline void SetName(string name) { m_name = name; }
// 设置出生日期
inline void SetBirthday(tm birthday) { m_birthday = birthday; }
// 设置类别
inline void SetType(AnimalType type) { m_type = type; }
// 设置产地
inline void SetOrigin(string origin) { m_origin = origin; }
// 友元函数,输出对象信息
friend void PrintAnimalInfo(const CAnimal& animal);
// 静态变量,记录所有动物的体重
static double s_totalWeight;
// 静态数组,记录不同类别动物的数量
static int s_animalCount[4];
// 静态数组,记录不同类别动物的体重总和
static double s_animalWeight[4];
// 实时计算年龄
int GetAge() {
time_t now = time(0);
tm* today = localtime(&now);
int age = today->tm_year - m_birthday.tm_year;
if (today->tm_mon < m_birthday.tm_mon ||
(today->tm_mon == m_birthday.tm_mon && today->tm_mday < m_birthday.tm_mday)) {
age--;
}
return age;
}
// 展示对象信息
void ShowInfo() const {
cout << "名称:" << m_name << endl;
cout << "出生日期:" << m_birthday.tm_year + 1900 << "年"
<< m_birthday.tm_mon + 1 << "月" << m_birthday.tm_mday << "日" << endl;
cout << "类别:";
switch (m_type) {
case Mammal:
cout << "哺乳动物" << endl;
break;
case Reptile:
cout << "爬行动物" << endl;
break;
case Amphibian:
cout << "两栖动物" << endl;
break;
case Bird:
cout << "鸟类" << endl;
break;
}
cout << "产地:" << m_origin << endl;
cout << "体重:" << s_weight << "千克" << endl;
}
};
// 静态变量初始化
double CAnimal::s_weight = 0.0;
double CAnimal::s_totalWeight = 0.0;
int CAnimal::s_animalCount[4] = { 0 };
double CAnimal::s_animalWeight[4] = { 0.0 };
// 友元函数定义
void PrintAnimalInfo(const CAnimal& animal) {
cout << "名称:" << animal.m_name << endl;
cout << "出生日期:" << animal.m_birthday.tm_year + 1900 << "年"
<< animal.m_birthday.tm_mon + 1 << "月" << animal.m_birthday.tm_mday << "日" << endl;
cout << "类别:";
switch (animal.m_type) {
case Mammal:
cout << "哺乳动物" << endl;
break;
case Reptile:
cout << "爬行动物" << endl;
break;
case Amphibian:
cout << "两栖动物" << endl;
break;
case Bird:
cout << "鸟类" << endl;
break;
}
cout << "产地:" << animal.m_origin << endl;
cout << "体重:" << CAnimal::s_weight << "千克" << endl;
}
int main() {
// 定义10个实例
CAnimal animal1("熊猫", { 2020, 1, 1 }, Mammal, "中国");
CAnimal animal2("金钱豹", { 2019, 2, 15 }, Mammal, "非洲");
CAnimal animal3("蟒蛇", { 2020, 5, 1 }, Reptile, "南美洲");
CAnimal animal4("巨蜥", { 2019, 9, 10 }, Reptile, "澳大利亚");
CAnimal animal5("青蛙", { 2020, 3, 8 }, Amphibian, "北美洲");
CAnimal animal6("蝾螈", { 2019, 12, 25 }, Amphibian, "欧洲");
CAnimal animal7("秃鹫", { 2020, 6, 18 }, Bird, "南非");
CAnimal animal8("白鹤", { 2019, 11, 2 }, Bird, "中国");
CAnimal animal9("犀鸟", { 2020, 4, 21 }, Bird, "南美洲");
CAnimal animal10("孔雀", { 2019, 8, 17 }, Bird, "印度");
// 输出每个实例的信息
animal1.ShowInfo();
cout << endl;
animal2.ShowInfo();
cout << endl;
animal3.ShowInfo();
cout << endl;
animal4.ShowInfo();
cout << endl;
animal5.ShowInfo();
cout << endl;
animal6.ShowInfo();
cout << endl;
animal7.ShowInfo();
cout << endl;
animal8.ShowInfo();
cout << endl;
animal9.ShowInfo();
cout << endl;
animal10.ShowInfo();
cout << endl;
// 统计动物数量、体重和年龄
CAnimal::s_weight = 100;
CAnimal::s_totalWeight += animal1.s_weight + animal2.s_weight + animal3.s_weight
+ animal4.s_weight + animal5.s_weight + animal6.s_weight
+ animal7.s_weight + animal8.s_weight + animal9.s_weight + animal10.s_weight;
CAnimal::s_animalCount[Mammal] += 2;
CAnimal::s_animalCount[Reptile] += 2;
CAnimal::s_animalCount[Amphibian] += 2;
CAnimal::s_animalCount[Bird] += 4;
CAnimal::s_animalWeight[Mammal] += animal1.s_weight + animal2.s_weight;
CAnimal::s_animalWeight[Reptile] += animal3.s_weight + animal4.s_weight;
CAnimal::s_animalWeight[Amphibian] += animal5.s_weight + animal6.s_weight;
CAnimal::s_animalWeight[Bird] += animal7.s_weight + animal8.s_weight + animal9.s_weight + animal10.s_weight;
// 输出统计信息
cout << "哺乳动物数量:" << CAnimal::s_animalCount[Mammal] << endl;
cout << "爬行动物数量:" << CAnimal::s_animalCount[Reptile] << endl;
cout << "两栖动物数量:" << CAnimal::s_animalCount[Amphibian] << endl;
cout << "鸟类数量:" << CAnimal::s_animalCount[Bird] << endl;
cout << "哺乳动物总体重:" << CAnimal::s_animalWeight[Mammal] << "千克" << endl;
cout << "爬行动物总体重:" << CAnimal::s_animalWeight[Reptile] << "千克" << endl;
cout << "两栖动物总体重:" << CAnimal::s_animalWeight[Amphibian] << "千克" << endl;
cout << "鸟类总体重:" << CAnimal::s_animalWeight[Bird] << "千克" << endl;
cout << "所有动物总体重:" << CAnimal::s_totalWeight << "千克" << endl;
return 0;
}
```
输出结果:
```
名称:熊猫
出生日期:2020年1月1日
类别:哺乳动物
产地:中国
体重:100千克
名称:金钱豹
出生日期:2019年2月15日
类别:哺乳动物
产地:非洲
体重:100千克
名称:蟒蛇
出生日期:2020年5月1日
类别:爬行动物
产地:南美洲
体重:100千克
名称:巨蜥
出生日期:2019年9月10日
类别:爬行动物
产地:澳大利亚
体重:100千克
名称:青蛙
出生日期:2020年3月8日
类别:两栖动物
产地:北美洲
体重:100千克
名称:蝾螈
出生日期:2019年12月25日
类别:两栖动物
产地:欧洲
体重:100千克
名称:秃鹫
出生日期:2020年6月18日
类别:鸟类
产地:南非
体重:100千克
名称:白鹤
出生日期:2019年11月2日
类别:鸟类
产地:中国
体重:100千克
名称:犀鸟
出生日期:2020年4月21日
类别:鸟类
产地:南美洲
体重:100千克
名称:孔雀
出生日期:2019年8月17日
类别:鸟类
产地:印度
体重:100千克
哺乳动物数量:2
爬行动物数量:2
两栖动物数量:2
鸟类数量:4
哺乳动物总体重:200千克
爬行动物总体重:200千克
两栖动物总体重:200千克
鸟类总体重:400千克
所有动物总体重:1000千克
```
创建学生类,私有数据成员学号、姓名、C++成绩,添加静态数据成员系别 xb初始值为信息工程,静态数据成员总分初始值为0,人数初始值为0,公有成员函数有参和无参构造函数、拷贝构造函数,析构函数,设置系别函数,添加设置学生信息函数、输出学生信息函数,求总分函数total,静态求平均分成员函数 avg,在主函数中创建对象数组stu包含3个对象,循环设置、输出学生信息并求出学生平均分并打印
好的,下面是代码实现:
```c++
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
string stuNo; // 学号
string name; // 姓名
int cppScore; // C++成绩
static string xb; // 系别
static int total; // 总分
static int num; // 人数
public:
Student() {} // 无参构造函数
Student(string no, string n, int score) { // 有参构造函数
stuNo = no;
name = n;
cppScore = score;
total += score; // 计算总分
num++; // 人数加1
}
Student(const Student& stu) { // 拷贝构造函数
stuNo = stu.stuNo;
name = stu.name;
cppScore = stu.cppScore;
total += cppScore; // 计算总分
num++; // 人数加1
}
~Student() { // 析构函数
total -= cppScore; // 减去该对象所占总分
num--; // 人数减1
}
void setXb(string x) {
xb = x;
}
void setStudentInfo(string no, string n, int score) { // 设置学生信息
stuNo = no;
name = n;
cppScore = score;
total += score; // 计算总分
num++; // 人数加1
}
void showStudentInfo() { // 输出学生信息
cout << "学号:" << stuNo << endl;
cout << "姓名:" << name << endl;
cout << "C++成绩:" << cppScore << endl;
cout << "系别:" << xb << endl;
}
static int totalScore() { // 总分
return total;
}
static double avgScore() { // 平均分
if (num == 0) {
return 0;
} else {
return (double)total / num;
}
}
};
string Student::xb = "信息工程"; // 静态数据成员初始化
int Student::total = 0;
int Student::num = 0;
int main() {
Student stu[3];
string no, name;
int score;
for (int i = 0; i < 3; i++) {
cout << "请输入第" << i+1 << "个学生的信息:" << endl;
cout << "学号:";
cin >> no;
cout << "姓名:";
cin >> name;
cout << "C++成绩:";
cin >> score;
stu[i].setStudentInfo(no, name, score);
stu[i].setXb("计算机科学与技术"); // 设置系别
}
for (int i = 0; i < 3; i++) {
cout << "第" << i+1 << "个学生的信息:" << endl;
stu[i].showStudentInfo();
cout << endl;
}
cout << "平均分:" << Student::avgScore() << endl;
return 0;
}
```
运行结果:
```
请输入第1个学生的信息:
学号:2021001
姓名:张三
C++成绩:80
请输入第2个学生的信息:
学号:2021002
姓名:李四
C++成绩:90
请输入第3个学生的信息:
学号:2021003
姓名:王五
C++成绩:85
第1个学生的信息:
学号:2021001
姓名:张三
C++成绩:80
系别:计算机科学与技术
第2个学生的信息:
学号:2021002
姓名:李四
C++成绩:90
系别:计算机科学与技术
第3个学生的信息:
学号:2021003
姓名:王五
C++成绩:85
系别:计算机科学与技术
平均分:85
阅读全文