运算符重载(二):重载赋值
重载赋值运算符
在一个类里面,编译器默认给我们添加了一个赋值运算符的重载,这样我们就能给两个对象之间进行赋值运算
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;}
};
运算符重载(二):重载赋值相关推荐
- 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事
look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...
- c++重载运算符_Chapter13:重载——入门(一)
一.走进重载 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloadin ...
- c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符
new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...
- c++运算符的全局重载
今天在看候捷的那本stl的时候,第二章有这么一段话 注意,由于*iter != value来检查元素值是否吻合,但是本例中value的数据类型是 int,iter的类型是ListItem<int ...
- C 运算符中不能重载的是哪些
C 运算符中不能重载的有:1.条件运算符"?:":2.成员访问运算符".":3.域运算符"::":4.长度运算符"sizeof&q ...
- C++可重载运算符和不可重载运算符
可重载运算符: 不可重载运算符:
- C#运算符重载(操作符重载)
1.什么是操作符重载 定义:(百科定义)就是把已经定义的.有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能.操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过 ...
- TS中的方法重载,函数重载,构造器重载
什么叫重载 名字相同 ,参数类型不同 方法重载 方法重载在类中定义多个同名的方法,但是每一个同名的方法要求不同数据类型和不同参数 下面来实现一个方法重载 以ArrayList 为例 可以查看数据 可以 ...
- 【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )
文章目录 一.map 集合 " - " 操作符重载 二.完整代码示例 一.map 集合 " - " 操作符重载 对 map 集合 使用 " - &qu ...
- 【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )
文章目录 一.map 集合 " + " 操作符重载 二.代码示例 一.map 集合 " + " 操作符重载 对 map 集合使用 " + " ...
最新文章
- java程序解压/压缩.gz文件
- 再谈Erlang代码热替换
- iOS ffmpeg 之编译ffmpeg
- 个人IHttpHandler,IHttpModule认识
- 今年最惨的交易:做空特斯拉
- Linux命令之 mkfs -- 在特定的分区创建 Linux 文件系统
- Linux命令之find命令中的-mtime参数
- 单片机ADC采样算法----中位值平均滤波法
- B.最大岛屿(dfs)
- 【2021团体程序设计天梯赛】L1部分(PTA,L1-073到L1-080)题解代码
- java的程序编码,JAVA编码转换的详细过程
- QL Server 2008新特性:FILESTREAM
- NPColorPicker
- 免费图床、mp3外链,音乐上传,QQ空间永久背景音乐,mp3联接
- [存储] Cobar使用文档(可用作MySQL大型集群解决方案)
- 计算机财务基础知识,财务部计算机基础知识培训.ppt
- OFD转PDF格式免费在线转换
- NSUOJ2888最小唯一表示前缀(偷懒的xzj)
- 从黑暗到光明,LED照明演变史知多少?内有彩蛋
- 163VIP邮箱哪个用的多?邮件误删恢复怎么操作?