C++(三十六) — 等号操作符重载、&&,||不可重载
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++(三十六) — 等号操作符重载、&&,||不可重载的更多相关文章
- 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...
- NeHe OpenGL教程 第三十六课:从渲染到纹理
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...
- Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础
第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
- “全栈2019”Java第三十六章:类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 微信小程序把玩(三十六)Storage API
原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)
风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
随机推荐
- docker卷挂载与容器内外互相拷贝数据
一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...
- Delphi ADOConnection连接
unit Unit_DM; interface usesSysUtils, Classes, DB, ADODB,inifiles,windows,forms,controls; typeTDM = ...
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- [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 ...
- [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 ...
- [LeetCode] 534. Design TinyURL 设计短网址
Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design ...
- 【机器学习之一】python开发spark环境搭建
环境 spark-1.6 python3.5 一.python开发spark原理使用python api编写pyspark代码提交运行时,为了不破坏spark原有的运行架构,会将写好的代码首先在pyt ...
- svn 版本控制搭建
1.安装SVN yum install subversion 2.开启服务 systemctl start svnserve.service 3.创建仓库 svnadmin create /opt/s ...
- React与Vue的比对
1.virtual dom 用JS模拟DOM结构,DOM变化的对比,放在JS层做,以提高重绘性能 DOM操作昂贵,JS运行效率高,要减少DOM操作 使用:snabbdom的使用 核心API:h函数 h ...
- Django重新添加字段然后迁移给定默认值依然迁移不生效
1.将对应app下的migrations文件夹下面的除了__init__.py文件外全部删除 2.delete from django_migrations where app='当前模型的app名称 ...