- 设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
class Per
{
string name;
int age;
int *height;
int *weight;
public:
Per():height(new int), weight(new int)
{
cout << "Per的无参构造" << endl;
}
Per(string name, int age, int height, int weight):name(name), age(age), height(new int(height)), weight(new int(weight))
{
cout << "Per的有参构造" << endl;
}
// Per &operator=(const Per &other)
// {
// name = other.name;
// age = other.age;
// height = new int(*(other.height));
// weight = new int(*(other.weight));
// *height = *(other.height);
// *weight = *(other.weight);
// cout << "Per的拷贝赋值函数" << endl;
// }
~Per()
{
cout << "准备释放Per空间"<< endl;
if (height != nullptr || weight != nullptr)
{
delete height;
height = nullptr;
delete weight;
weight = nullptr;
}
cout << "Per的析构函数" << endl;
}
Per(Per &other)
{
name = other.name;
age = other.age;
height = new int(*(other.height));
weight = new int(*(other.weight));
// *height = *(other.height);
// *weight = *(other.weight);
cout << "Per的拷贝构造函数" << endl;
}
void show()
{
cout << "name = " << name;
cout << " age = " << age;
cout << " *height = " << *height;
cout << " *weight = " << *weight << endl;
// cout << "name = " << &name;
// cout << " age = " << &age;
// cout << " *height = " << height;
// cout << " *weight = " << weight << endl;
}
};
class Stu
{
int score;
Per *p1;
public:
Stu(int score, Per p1):score(score), p1(new Per(p1))
{
cout << "Stu的有参构造" << endl;
}
Stu(Stu &other)
{
p1 = new Per(*(other.p1));
// *(p1) = *(other.p1);
score = other.score;
cout << "Stu的拷贝构造函数" << endl;
}
~Stu()
{
cout << "准备释放Stu空间"<< endl;
delete p1;
p1 = nullptr;
cout << "Stu的析构函数" << endl;
}
void show()
{
cout << "score = " << setw(4) << left << score;
p1->show();
}
};
int main()
{
Per p1("zhangsan", 18, 170, 64);
cout << "p1: ";
p1.show();
Stu s1(100, p1);
cout << "s1: ";
s1.show();
Stu s2 = s1;
cout << "s2: ";
s2.show();
return 0;
}
思维导图