重载赋值运算符

在一个类里面,编译器默认给我们添加了一个赋值运算符的重载,这样我们就能给两个对象之间进行赋值运算

class Role
{
public:int hp;int mp;
}
int main()
{Role x,y;x.hp=100;x.mp=200;y=x;std::cout<<y.hp<<y.mp;
}

像这样,就完成了两个对象之间的赋值

但是如果在代码中加上这么一行,就不能完成赋值

class Role
{
public:int hp;int mp;Role& operate=(const Role& role)=delete;
}
int main()
{Role x,y;x.hp=100;x.mp=200;y=x;std::cout<<y.hp<<y.mp;
}

以上的代码是不能运行的,因为删除了默认的重载赋值的函数

特别注意*:类的赋值重载只能是成员函数,不能是全局函数

我们自己重载一下

class Role
{
public:int hp;int mp;Role& operator= (const Role& role);
};
Role& Role::operator= (const Role& role)
{hp = role.hp;mp = role.mp+100;return *this;
}

这里的返回值为什么要写成Role&呢?因为如果我们要实现x=y=z,就要把它的返回值写成Role类型,用引用更加省内存。

既然,我们有了默认的赋值重载,为什么还要自己实现一个赋值重载呢,那是因为默认的赋值重载不能解决浅拷贝带来的问题

class hstring
{
private:char* cstr;
public:hstring(const char* _str){cstr = (char*)_str;}char* getstr(){return cstr;}
};
int main()
{char str[]{ "1234567890aaaaa" };hstring hstr(str);    str[0] = 0 ;std::cout << hstr.getstr();system("pause");
}

这里,最后居然无法输出,当我们改变str的值后,hstr居然有跟着改变,是因为它们共享一个内存

下面,我们写一个如何重载=,并解决浅拷贝的问题

hstring.cpp的内容

#include"hstring.h"
hstring::hstring()
{cstr = nullptr;     //指针初始化usmlen = 0x32;      //给予usmlen一个初始值,不然进入copystr函数后,无法与len进行比较
}
unsigned short hstring::getlength(const char* str)
{unsigned short len{};for (; str[len]; len++);return len;
}
void hstring::copystr(char*& dest, const char* source)
{unsigned short len = getlength(source);if (len > usmlen){dest = new char[len+1];   //重新分配内存uslen = len;}else{uslen = len;dest = new char[usmlen]; }memcpy(dest, source, len);dest[len] = 0;
}
hstring::hstring(const char* _str) :hstring()
{copystr(cstr, _str);
}
hstring::hstring(const hstring& hstr) : hstring()
{copystr(cstr, hstr.cstr);
}
hstring& hstring::operator=(const hstring& hstr)
{copystr(cstr, hstr.cstr);return *this;
}
hstring& hstring::operator=(const char* str)
{cstr = nullptr;usmlen = 0x32;copystr(cstr, str);return *this;
}
hstring& hstring::operator=(const long long value)
{std::string str= std::to_string(value);const char* p = str.c_str();copystr(cstr, p);return *this;
}

为什么这里的 operator=(const char* str)不需要写呢?

主函数

#include<iostream>
#include"hstring.h"int main()
{char* c_str { "1234552444" };hstring hstr=c_str;         /调用了hstring(const char* _str)  std::cout << hstr<< std::endl;hstring hstr1=hstr;         /调用了hstring(const hstring& hstr)hstr1 = hstr;               /调用了hstring::operator=(const hstring& hstr)std::cout << hstr1 << std::endl;char a_str[]{ "888888" };   /调用了hstring& hstring::operator=(const char* str)hstr1 = a_str;std::cout << hstr1 << std::endl;system("pause");
}

hstring.h的内容

#pragma once
#include<iostream>
#include<string>
class hstring
{
private:unsigned short usmlen{};   //新建的内存长度char* cstr;             //字符串unsigned short getlength(const char* str);     //得到对象的字符串长度void copystr(char*& dest, const char* source);   //复制内存函数
public:hstring();hstring(const char* _str);hstring(const hstring& hstr);hstring& operator=(const hstring& str);hstring& hstring::operator=(const long long value);hstring& operator= (const char* str);char* getstr(){return cstr;}
};

运算符重载(二):重载赋值相关推荐

  1. 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事

    look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...

  2. c++重载运算符_Chapter13:重载——入门(一)

    一.走进重载 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloadin ...

  3. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  4. c++运算符的全局重载

    今天在看候捷的那本stl的时候,第二章有这么一段话 注意,由于*iter != value来检查元素值是否吻合,但是本例中value的数据类型是 int,iter的类型是ListItem<int ...

  5. C 运算符中不能重载的是哪些

    C 运算符中不能重载的有:1.条件运算符"?:":2.成员访问运算符".":3.域运算符"::":4.长度运算符"sizeof&q ...

  6. C++可重载运算符和不可重载运算符

    可重载运算符: 不可重载运算符:

  7. C#运算符重载(操作符重载)

    1.什么是操作符重载 定义:(百科定义)就是把已经定义的.有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能.操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过 ...

  8. TS中的方法重载,函数重载,构造器重载

    什么叫重载 名字相同 ,参数类型不同 方法重载 方法重载在类中定义多个同名的方法,但是每一个同名的方法要求不同数据类型和不同参数 下面来实现一个方法重载 以ArrayList 为例 可以查看数据 可以 ...

  9. 【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " - " 操作符重载 二.完整代码示例 一.map 集合 " - " 操作符重载 对 map 集合 使用 " - &qu ...

  10. 【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " + " 操作符重载 二.代码示例 一.map 集合 " + " 操作符重载 对 map 集合使用 " + " ...

最新文章

  1. java程序解压/压缩.gz文件
  2. 再谈Erlang代码热替换
  3. iOS ffmpeg 之编译ffmpeg
  4. 个人IHttpHandler,IHttpModule认识
  5. 今年最惨的交易:做空特斯拉
  6. Linux命令之 mkfs -- 在特定的分区创建 Linux 文件系统
  7. Linux命令之find命令中的-mtime参数
  8. 单片机ADC采样算法----中位值平均滤波法
  9. B.最大岛屿(dfs)
  10. 【2021团体程序设计天梯赛】L1部分(PTA,L1-073到L1-080)题解代码
  11. java的程序编码,JAVA编码转换的详细过程
  12. QL Server 2008新特性:FILESTREAM
  13. NPColorPicker
  14. 免费图床、mp3外链,音乐上传,QQ空间永久背景音乐,mp3联接
  15. [存储] Cobar使用文档(可用作MySQL大型集群解决方案)
  16. 计算机财务基础知识,财务部计算机基础知识培训.ppt
  17. OFD转PDF格式免费在线转换
  18. NSUOJ2888最小唯一表示前缀(偷懒的xzj)
  19. 从黑暗到光明,LED照明演变史知多少?内有彩蛋
  20. 163VIP邮箱哪个用的多?邮件误删恢复怎么操作?

热门文章

  1. 内存按字节 (Byte)编址,地址从A0000H到DFFFFH,共有多少个字节呢?
  2. 如何进行系统安全评估
  3. 【Theano】安装教程
  4. SQL 取数值小数后两位,但不四舍五入。
  5. matlab 求曲面体积,matlab求两曲面之间的体积
  6. [征询意见]关于博客园与出版社合作出书
  7. ffmpeg h264文件转mp4
  8. Android获取手机信号强度
  9. 智能工厂数字化落地应用技术方案
  10. 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵