重载赋值运算符 && 对象
class CMessage
{
private:
char * m_pMessage; public:
void showIt()const
{
cout << m_pMessage << endl;
}
//构造函数
CMessage(const char* text="Default message")
{
cout << "Constructor difinition" << endl; size_t length{strlen(text)+};
m_pMessage = new char[length+];
strcpy_s(m_pMessage,length+,text);
}
//复制构造函数
CMessage(const CMessage & aMess)
{
size_t len{strlen(aMess.m_pMessage)+};
this->m_pMessage = new char[len];
strcpy_s(m_pMessage,len,aMess.m_pMessage);
}
//重载赋值运算符
CMessage & operator=(const CMessage & aMess)
{
if (this!= &aMess)
{
delete[]m_pMessage;
size_t length{strlen(aMess.m_pMessage)+};
m_pMessage = new char[length];
strcpy_s(this->m_pMessage,length,aMess.m_pMessage);
}
return *this;
} //析构函数
~CMessage()
{
cout << "Destructor called" << endl;
delete[]m_pMessage;
}
}; int main()
{
CMessage motto1{"Amiss is as good as a mile"};
CMessage motto2; motto2 = motto1; motto2.showIt();
motto1.showIt(); return ;
}
复制构造函数:
当某个类动态的为数据成员分配空间,又利用按值传递给函数传递该类的对象,那么必须要实现复制构造函数
如:
motto2 {motto1};
或
CMessage & displayMessage(CMessage localMsg)
{
cout <<"the message is:----------------" << endl;
localMsg.showIt();
return *this;
}
都会出现异常,如果没有实现复制构造函数,即两个对象的指针指向了同一块地址区域。
重载赋值运算符:
以现有的同类对象进行初始化类的对象,或者通过按值传递方式给函数传递对象,调用默认复制构造函数。
当赋值语句的左边和右边是同类类型的对象时,调用默认赋值运算符。
如:
motto2 = motto1;
如果我们没有实现赋值运算符函数,编译器就会使用默认的赋值运算符函数,当为数据成员动态的分配内存,进行对象赋值,就会程序异常。
因为两个对象都有一个指向相同内存地址的指针。
分析赋值运算符函数:
CMessage & operator=(const CMessage & aMess)
{ if (this!= &aMess)
{
delete[]m_pMessage;
size_t length{strlen(aMess.m_pMessage)+1};
m_pMessage = new char[length];
strcpy_s(this->m_pMessage,length,aMess.m_pMessage);
}
return *this;
}
delete[]m_pMessage; 删除分配给第一个对象的内存,重新分配足够的内存,以容纳第二个对象的字符串。
1、当 motto1 = motto1;会发生什么呢?
赋值运算符函数会释放 motto1 对象成员指向的内存
所以,if (this!= &aMess) 这条语句,是有必要的。
2、那么返回对象为什么?
motto1 = motto2=motto3;
这条语句的原型是:
motto1.operator=(motto2.operator=(motto3));
可知 motto2.operator=(motto3) 的结果必须是对象才能作为 motto1.operator=()的参数。
3、那么返回引用为什么?
(motto1 = motto2)=motto3;
这条语句的原型是:
(motto1.operator=(motto2)).operator=(motto3);
可知(motto1.operator=(motto2))的结果是个是个返回的临时对象,它是 rvalue ,编译器不允许使用 rvalue 调用函数成员。
而返回引用它是 lvalue。
重载赋值运算符 && 对象的更多相关文章
- 《挑战30天C++入门极限》C++运算符重载赋值运算符
C++运算符重载赋值运算符 自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下 ...
- mfc 重载赋值运算符
重载赋值运算符= 一.重载运算符格式 返回类型 operator 运算符 (参数); 如: bool operator=(char*s); int operator>(char*s); bool ...
- 《剑指offer》第一题(重载赋值运算符)
//重载赋值运算符 #include <iostream> #include <cstring> using namespace std; class CMystring { ...
- Python学习手册之内部方法、操作符重载和对象生命周期
在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...
- C++重载赋值运算符
这是一道C++的面试题,下面在这篇博客中分析一下这个问题.先上题目: //题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: ...
- Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组
类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...
- JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象
public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符摘要: 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同时马上进行的初始化操作 ...
- C++学习31 重载=(赋值运算符)
和普通变量一样,对象之间也可以相互赋值.赋值运算符“=”可以用来将一个对象拷贝给另一个已经存在的对象.对象之间的赋值是将成员变量依次拷贝,而不是将整个对象的内存按位拷贝. 对象之间的赋值: #incl ...
随机推荐
- Arduino 学习
Arduino 背景可以参考官方网站www.arduino.cc 先看一个最简单的示例程序: 打开 Arduino IDE , 选择菜单:文件 -> 示例 -> 01.Basics -&g ...
- 老鼠跑猫叫主人惊醒c++观察者模式实现
这个题目算是比较经典的观察者模式了,老鼠作为一个Subject,主动发出跑的动作,紧跟着猫由于老鼠的跑而发出叫声,主人也被惊醒,在这里猫跟主人都是被动的,是观察者角色,代码实现如下: class CS ...
- Jconsole加载Jtop插件
Jconsole加载Jtop插件http://automationqa.com/forum.php?mod=viewthread&tid=3719&fromuid=2
- 使用 SyndicationFeed 输出 Rss
以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...
- 如何使用新浪微博账户进行应用登录验证(基于Windows Azure Mobile Service 集成登录验证)
使用三方账号登录应用应该对大家来说已经不是什么新鲜事儿了,但是今天为什么还要在这里跟大家聊这个话题呢,原因很简单 Windows Azure Mobiles Service Authenticatio ...
- Factorization Machine
Factorization Machine Model 如果仅考虑两个样本间的交互, 则factorization machine的公式为: $\hat{y}(\mathbf{x}):=w_0 + \ ...
- 消息中间件Notify和MetaQ-阿里中间件
3.1.Notify Notify是淘宝自主研发的一套消息服务引擎,是支撑双11最为核心的系统之一,在淘宝和支付宝的核心交易场景中都有大量使用.消息系统的核心作用就是三点:解耦,异步和并行.下面让我以 ...
- ext 3.x 让uploadPanel支持swfupload
经常做系统的时候会遇到上传组件,特别是大文件的时候总是很郁闷,长时间无响应导致糟糕的用户体验,所以决定采用swfupload来支持文件上传. 大体代码如下. var upload = {}; uplo ...
- c/c++:重载 覆盖 隐藏 overload override overwrite
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...
- KIS旗舰版常用数据表
select * from IC_Web2ERPOrders --网上订单 FOrderStatus 14--已发货,6--待发货,2--待配货,1--未审核 (审核后变为2,进入待配货)sele ...