在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete。绝对不会有类似的问题。

当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时,采用浅拷贝,导致对象析构时会对同一块内存空间析构两次。也就是说等号操作符“=”,默认是进行浅拷贝,我们需要对等号操作符进行重载,使其能够进行深拷贝。

同时要重载等号操作符支持链式编程,类如 s3 = s4 = s5;  //操作符使对象连载叠加,与上一篇的return *this 与 return this已经介绍过如何返回对象本身。而不是克隆。

这里写了 重载等号操作符实现深拷贝 与 操作符使对象连载叠加 的代码。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string.h>
#include<windows.h>
using namespace std;
class student
{
public:
 student()
 {
  //默认构造函数
  cout << "This is studnt();" << endl;
  this->id = 0;
  this->name = NULL;
 }
 student(int id, const char *name)
 {
  this->id = id;
  //深拷贝构造
  int len = strlen(name);
  this->name = new char[len + 1];
  strcpy(this->name, name);
 }
 student(const student &another)
 {
  //拷贝构造
  this->id = another.id;
  int len = strlen(another.name);
  this->name = new char[len + 1];
  strcpy(this->name, another.name);
 }
 student & operator=(const student &another)
 {
  // 1.防止自身赋值
  if (this == &another)
  {
   return *this;
  }
  // 2. 给自己额外开辟的内存空间释放掉
  if (this->name != NULL)
  {
   delete[] this->name;
   this->name = NULL;
   this->id = 0;
  }
  //3. 执行深拷贝
  this->id = another.id;
  int len = strlen(another.name);
  this->name = new char[len + 1];
  strcpy(this->name, another.name);
  return *this;
 }
 void printf_id_name()
 {
  cout << "id= " << id << " name= " << name << endl;
 }
 ~student()
 {
  if (this->name != NULL)
  {
   delete[] this->name;
   this->name = NULL;
   this->id = 0;
  }
 }
private:
 int id;
 char *name;
}; int main(void)
{
 student s1(1, "C++");
 student s2;
 student s3(3, "ZJD666");
 
 s2=s3; //深拷贝 等号操作符重载
 s1.printf_id_name();
 s2.printf_id_name();
 s3.printf_id_name();
 cout <<" --------------------------" << endl;
 student s4(4, "Hello World!");
 student s5(5, "Hello C++!");
 s3 = s4 = s5;  //操作符连载
 s3.printf_id_name();
 system("pause");
 return 0;
}

供学习等号操作符重载参考!!

最新文章

  1. Scala学习(一)
  2. Java HttpGet
  3. hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混
  4. C#Matlab混合编程类 初始化问题解决方法
  5. centos 配置固定ip
  6. FCK编辑器漏洞总结
  7. Linux设备模型(9)_device resource management ---devm申请空间【转】
  8. unity shader在小米2s上的问题
  9. 集合框架Map之KeySet方法的使用
  10. Android Studio更新失败
  11. UltraISO对光盘镜像的常用操作
  12. iOS开发——C篇&amp;动态内存分配
  13. SQL Prompt5 破解版+使用说明 [转]
  14. python自动化开发-2
  15. XML文件的解析—DOM、SAX
  16. react native 学习笔记
  17. readlink: command not found 解决方案
  18. Menu显示三个点,不显示内容
  19. Gym 101194A / UVALive 7897 - Number Theory Problem - [找规律水题][2016 EC-Final Problem A]
  20. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计

热门文章

  1. spring5 源码深度解析----- AOP目标方法和增强方法的执行(100%理解AOP)
  2. yii2 对字段 自动加一 或 减一
  3. c++ 对特定进程的内存监控
  4. 如何选择一款适合自己操作系统、Windows、Mac还是Linux?
  5. A-01 最小二乘法
  6. 【C语言笔记】#define与typedef的区别
  7. [Abp vNext 源码分析] - 11. 用户的自定义参数与配置
  8. Maven安装和在IDEA配置Maven
  9. Unity的学习笔记(射线检测)
  10. iguana::json/xml 序列化框架