在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好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;
}

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

C++等号操作符重载的更多相关文章

  1. C++(三十六) — 等号操作符重载、&&,||不可重载

    1.等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1 ...

  2. 再议Swift操作符重载

    今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ...

  3. C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载

    1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...

  4. Kotlin 之操作符重载

    Kotlin 之操作符重载   参考: kotlin in action kotlin 官方参考文档 运算符重载 Kotlin允许我们为自己的类型提供预定义的一组操作符实现(这些操作符都对应的成员函数 ...

  5. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  6. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  7. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  8. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  9. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

随机推荐

  1. ELK 学习笔记之 elasticsearch启动时Warning解决办法

    elasticsearch启动时Warning解决办法: 转载:http://www.dajiangtai.com/community/18136.do?origin=csdn-geek&dt ...

  2. 2.css3表示颜色的几种方式

    1.css3中表示颜色的几种方式: ⑴颜色名称.十六进制.RGB方式: ⑵RGBA方式:新增了alpha参数,介于0.0(完全透明)到1.0(完全不透明)之间: ⑶HSL方式:分别表示色调.饱和度.亮 ...

  3. html5一些特性

    html5可以理解为html+css+js 其目前可以解决:1.浏览器的兼容问题 2.统一web应用标准 3.解决文档结构定义不明确问题 4.解决web应用中的功能受限问题 5.是程序员编写的web应 ...

  4. JavaWeb http协议的自我描述

    1.http协议的组成 http:规范那种协议 localhost.127.0.0.1:访问的ip地址(默认,根据自己的需求改变) 端口号:8080(默认,根据自己的需求改变) 工程:XXX 资源:可 ...

  5. Ubuntu18.04安装好MySQL5.7后,root账号登录密码问题

    不知道从哪个版本开始,在Ubuntu上用apt安装MySQL后,不会提示让你设置密码了. 安装MySQL5.7 sudo apt install mysql-server -y 然后找到MySQL的配 ...

  6. ELK日志分析系统(4)-elasticsearch数据存储

    1. 概述 logstash把格式化的数据发送到elasticsearch以后,elasticsearch负责存储搜索日志数据 elasticsearch的搜索接口还是很强大的,这边不详细展开,因为k ...

  7. B-概率论-极大似然估计

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  8. CSS3属性—— line-clamp控制文本行数

    说明: 限制在一个块元素显示的文本的行数. -webkit-line-clamp 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中. 为 ...

  9. Qt5教程: (2) 信号与槽

    1. 新建工程 新建一个"Qt Widgets Application"工程 2. 添加按钮 一个Qt工程会有很多个控件, 如果把逻辑代码都写在main函数里, main函数会非常 ...

  10. Oracle11g入门

    数据类型 数据类型 表示 数字 number 日期时间 date 字符串 char(长度)/varchar2(长度) 约束条件 名称 约束 唯一 unique 非空约束 not null 主键约束 p ...