C++:复制构造函数与析构函数

2020-10-16 92点热度 2人点赞

复制构造函数的一个实例

#include <iostream>
using namespace std;
/**
 * 复制构造函数不是必须的,如果一个类中没有定义复制构造函数,则系统自动生成一个默认复制构造函数,其功能是将已知对象的值复制给对应对象的数据成员
 * C++提供了用一个对象的值创建并初始化另一个新对象的方法,完成该功能的是复制构造函数。
 * 复制构造函数有以下特点:
 * (1)复制构造函数与类同名,没有返回类型
 * (2)复制构造函数只有一个形参,该参数是该类的对象的引用。
 * */
class computer
{
  //默认访问权限是私有的
  int op1; //操作数
  char ch; //运算符
  int op2; //操作数

public:
  computer(computer &e)
  {
    //复制构造函数
    //在复制时对两个要操作的数进行交换
    this->op1 = e.op2;
    this->ch = e.ch;
    this->op2 = e.op1;
    cout << "调用了复制构造函数" << endl;
  }
  computer(int b, char d, int c)
  {
    this->op1 = b;
    this->ch = d;
    this->op2 = c;
  }
  computer()
  {
  }
  void Set(int b, char d, int c)
  {
    op1 = b;
    ch = d;
    op2 = c;
  }
  void Show();
  void Init()
  {
    op1 = 3;
    ch = '-';
    op2 = 5;
  }
};
void computer::Show()
{
  //成员函数类外实现
  switch (ch)
  {
  case '+':
    cout << op1 + op2 << endl;
    break;
  case '-':
    cout << op1 - op2 << endl;
    break;
  case '*':
    cout << op1 * op2 << endl;
    break;
  case '/':
    if (op2 == 0)
    {
      cout << "不能被0整除" << endl;
      break;
    }
    cout << op1 / op2 << endl;
    break;
  default:
    cout << "运算符输入有误" << endl;
  }
}
int main()
{
  computer c;
  c.Init(); //通过成员对象进行初始化
  c.Show();
  computer d(c); //调用默认构造函数,此句与computer d = c等价
  d.Show();      //显示运行结果
  return 0;
}

析构函数实例

#include <iostream>
#include <cstring>
using namespace std;
/**
 * 析构函数是一种用于撤销对象,回收对象占有资源的特殊对象函数,它与构造函数功能互补,成对出现。
 * 如果在类中未显式定义析构函数,系统会自动调用一个默认析构函数,该函数无参数,函数体为空。
 * 析构函数有以下特点:
 * (1)无返回类型,但是不要加void
 * (2)无参数,因此不存在析构函数重载,只有一个析构函数
 * (3)在对象释放时由系统自动调用
 * (4)如果程序中未声明,则系统自动产生一个默认析构函数。
 * (5)析构函数与构造函数的功能相对应,所以析构函数名师构造函数名前加一个逻辑反运算符‘~’。
 * (6)析构函数按照与调用构造函数相反的顺序被调用。
 * 必须定义析构函数的情况如下:
 * (1)构造函数打开一个文件,使用完文件时需要关闭文件。
 * (2)从堆中分配了动态内存区,在对象消失之前必须释放。
 * */
class CStuScore
{
public: //共有类型声明
  void Show()
  {
    cout << strName << "的平均成绩为:" << GetAverage() << endl;
  }
  CStuScore(char *pName, int no, float s0, float s1, float s2)
  {
    strName = new char[12];
    strcpy(strName, pName);
    iStuNO = no;
    fScore[0] = s0;
    fScore[1] = s1;
    fScore[2] = s2;
    cout << "调用构造函数" << endl;
  }
  ~CStuScore()
  {
    delete[] strName; //释放动态申请的内存
    //delete[] strStuNO; //释放动态申请的内存
    cout << "调用析构函数" << endl;
  }

private:              //私有类型声明
  float fScore[3];    //3门课程成绩
  char *strName;      //姓名
  int iStuNO;         //学号
  float GetAverage(); //计算平均成绩
};
float CStuScore::GetAverage() //计算平均成绩
{
  return (fScore[0] + fScore[1] + fScore[2]) / 3.0;
}
int main()
{
  CStuScore oOne("xiaoming", 1234567, 99, 95, 90);
  oOne.Show();
  return 0;
}

未经允许不得转载!C++:复制构造函数与析构函数

本文地址:https://ai.52learn.online/1817

站长邮箱:ai52learn@foxmail.com