1、等号操作符重载,实现深拷贝

//等号运算符重载
// obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝
Name& operator=(Name &obj1)
{
//1、先释放旧的内存
if (this->m_p != nullptr)
{
delete[] m_p;
m_len = ;
}
//2、根据 obj1 分配内存大小
this->m_len = obj1.m_len;
this->m_p = new char[m_len + ];
//3、把obj1赋值给obj3
strcpy(m_p, obj1.m_p);
return *this;//返回引用,实现链式编程
}

2、赋值运算符重载

由于动态申请了堆空间,因此必须重载复制构造函数和赋值运算符

(1)复制构造函数在创建对象时调用,此时对象还不存在,只需申请空间,不需释放原有的;

(2)赋值运算符在对象已经存在的情况下调用,需要先释放原有对象占用的空间,然后申请新的空间;由于原有空间大小不一定满足现有需求,所以要先释放后申请。

 问题:

(1)删除赋值运算符的重载,程序是否正常,为什么?

答:程序可以正常运行,但结束时会出现内存错误,因为 name 所指向的内存被释放了 2 次。 由于自动调用了默认的 等号运算符 ,出现两个对象公用一个内存空间。

class student
{
public:
student(int i = , char *c = NULL, float s = );
student(student& s);
student& operator=(student& s);
~student()
{
delete []name;
}
void printstu()
{
cout << "numner: " << id << " name: " << name << " score: "<<score << endl;
}
private:
int id;
char* name;
float score;
};
student::student(int i, char* c, float s)
{
id = i;
score = s;
if (c == NULL)
{
name = nullptr;
}
else
{
name = new char[strlen(c) + ];
strcpy_s(name, strlen(c) + , c);
}
}
// 复制构造函数
student::student(student& s)
{
id = s.id;
score = s.score;
name= new char[strlen(s.name) + ];
if (name != )
strcpy_s(name, strlen(s.name) + , s.name);
}
//重载赋值运算符
student& student::operator=(student& s)
{
id = s.id;
score = s.score;
delete[]name;
name = new char[strlen(s.name) + ];
strcpy_s(name, strlen(s.name) + , s.name);
return *this;
}
void main()
{
student s1(, "wang", );
s1.printstu(); student s2(s1);//可以在定义时,直接初始化,自动调用复制构造函数
student s3; //因为使用了 等号运算符,所以如果不重载,则会自动调用默认的等号运算。
s3 = s1;
s2.printstu();
system("pause");
}

3、逻辑与和逻辑或,不能运算符重载

&& ,||, 重载他们不会产生短路规则。例子:t1 &&(t2+t3),前面的 t1 不成立,则不会执行后面的语句。

C++(三十六) — 等号操作符重载、&&,||不可重载的更多相关文章

  1. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  2. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  4. Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  5. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  6. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  7. “全栈2019”Java第三十六章:类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. 微信小程序把玩(三十六)Storage API

    原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...

  9. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  10. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

随机推荐

  1. docker卷挂载与容器内外互相拷贝数据

    一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...

  2. Delphi ADOConnection连接

    unit Unit_DM; interface usesSysUtils, Classes, DB, ADODB,inifiles,windows,forms,controls; typeTDM = ...

  3. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  4. [LeetCode] 108. Convert Sorted Array to Binary Search Tree 把有序数组转成二叉搜索树

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  5. [LeetCode] 156. Binary Tree Upside Down 二叉树的上下颠倒

    Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that ...

  6. [LeetCode] 534. Design TinyURL 设计短网址

    Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design ...

  7. 【机器学习之一】python开发spark环境搭建

    环境 spark-1.6 python3.5 一.python开发spark原理使用python api编写pyspark代码提交运行时,为了不破坏spark原有的运行架构,会将写好的代码首先在pyt ...

  8. svn 版本控制搭建

    1.安装SVN yum install subversion 2.开启服务 systemctl start svnserve.service 3.创建仓库 svnadmin create /opt/s ...

  9. React与Vue的比对

    1.virtual dom 用JS模拟DOM结构,DOM变化的对比,放在JS层做,以提高重绘性能 DOM操作昂贵,JS运行效率高,要减少DOM操作 使用:snabbdom的使用 核心API:h函数 h ...

  10. Django重新添加字段然后迁移给定默认值依然迁移不生效

    1.将对应app下的migrations文件夹下面的除了__init__.py文件外全部删除 2.delete from django_migrations where app='当前模型的app名称 ...