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 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
随机推荐
- matlab学习笔记10 一般运算符
一起来学matlab-matlab学习笔记10 10_1一般运算符 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- 转 全新多媒体共享器Ipush推送|Miracast WIFI无线同屏推送
http://www.52bjw.cn/product-info/5767857.html 操作指南及注意事项 (draft) miracast和dlna/airplay分别工作在wifi direc ...
- [简短问答]LODOP打印不清晰
用什么语句输出的:使用的的是什么语句输出的,是ADD_PRINT_TEXT纯文本,还是html的超文本. 超文本不清晰:如果用的是ADD_PRINT_HTML ,换成 ADD_PRINT_HTM试试, ...
- IntellJ idea maven打包——项目带有第三方jar包
今天用maven打包时,提示程序包com.aspose.slides不存在 原来第三方jar是直接导入的,打包时没找到 那项目中带有第三方jar包,怎么打包? 方法: 1.根路径建立lib包,将第三方 ...
- 手贱重置了mysql密码,导致登陆不进去的解决办法
上午手残,重置了下MySQL的密码,导致用命令登陆不进去 由于版本的问题,导致网上的方法都不可用 折腾了一上午,摸索+参考官方文档,终于搞定 利用--init-file 第一步,关掉系统服务 ...
- 使用objcopy实现将文件编译进执行程序
一.简介 工作中可能遇到将一个文件编译进执行程序的需求,例如bin文件.jpg文件等等.实现的方法可以使用脚本来将文件内容写入一个新的C源文件数组,达成编译进程序的目的. 现在介绍一种简单.快捷的方 ...
- TCP/IP学习笔记12-- IP协议基础
IP(internet protocol, 网际协议) IP相当于OSI参考模型中的第三层 -- 网络层. --网络层的下一层--数据链路层的主要作用是在 同一种数据链路 的节点之间进行包传递,而一旦 ...
- qt creator的使用总结
每一个不曾起舞的日子,都是对生命的辜负----------尼采 1. HELP功能: 1)有时点击"HELP"之后,对应的页面里没有左侧的搜索栏.比较理想的状态是将左侧导航栏划分 ...
- Spring Boot之从Spring Framework装配掌握SpringBoot自动装配
Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...
- C++ 读写 Excel 文件
//Microsoft Visual Studio 2015 Enterprise #include <fstream> #include <string> #include ...