8月23日 C++ DAY 3

  1. 设计一个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;
}

思维导图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值