运算符重载(二):重载赋值

news/2024/12/1 7:04:01/

重载赋值运算符

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

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];   //重新分配内存usmlen = len;}dest = new char[0x32];memcpy(dest, source, usmlen);
}
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" };char a_str[]{ "88888" };hstring hstr=c_str;    调用了hstring(const char* _str)                            hstring hstr1=hstr;    调用了hstring(const hstring& hstr)hstr1 = hstr;          调用了hstring::operator=(const hstring& hstr)hstr1 = a_str;         调用了hstring& hstring::operator=(const char* str)hstr1 = 999999;        调用了hstring& hstring::operator=(const long long value)std::cout << hstr.getstr() << std::endl;std::cout << hstr1.getstr() << 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;}
};


http://www.ppmy.cn/news/47895.html

相关文章

SOAP or REST APIs的区别

SOAP和REST是两种不同的Web服务API。 它们之间的主要区别如下: 数据格式 SOAP只支持XML格式,REST支持多种格式,如XML、JSON等。服务定义 SOAP基于WS-*标准,服务定义通过WSDL文件完成。REST不依赖WS-*标准,服务定义主要通过URI完成。通讯协议 SOAP只支持HTTP协议,REST通常支持H…

Spring底层核心原理

文章目录 Spring底层核心原理Bean的生命周期推断构造方法AOP原理Spring事务 Spring底层核心原理 下面这几行代码是一个Spring的入门代码&#xff0c;第一行是通过java配置类 注解的方式创建一个Spring容器&#xff0c;第二行是通过XML配置文件的方式创建一个Spring容器 Annot…

EMC 专用名词大全~电压变化与闪烁

8.1 电压变化 voltage change 在一定但非规定的时间间隔内电压均方很值或峰值在两个相邻电平问的持续变动。 8.2 相对电压变化 relative voltage change 电压变化的幅值与额定电压值之比。 8.3 电压变化持续时间 duration of a voltage change 电压由初值增大或减小至终值所经历…

使用AIDEGen进行AOSP开发

什么是AIDEGen AIDEGen&#xff0c;大概是“Android IDE (helper) Generator”的简写&#xff0c;是 AOSP 源代码树中的一个工具&#xff0c;它允许从 Android Studio 等通常仅为非平台应用程序开发配置的 IDE 中处理系统应用程序。 AIDEGen 旨在自动化项目设置过程&#xff…

SpringBoot 介绍

1.简介 SpringBoot最开始基于Spring4.0设计&#xff0c;是由Pivotal公司提供的框架。 SpringBoot发展史&#xff1a; 2003年Rod Johnson成立Interface公司&#xff0c;产品是SpringFramework2004年&#xff0c;Spring框架开源&#xff0c;公司改名为Spring Source2008年&…

数据库复习资料abc

1、数据库设计过程一般包括哪些内容&#xff1f; 答&#xff1a;需求分析、概念设计、逻辑设计、物理设计、应用开发&#xff08;系统实施&#xff09;、系统维护。 2、数据库系统的特点&#xff1f; 答&#xff1a;数据结构化、数据共享性高&#xff0c;数据独立性强&#x…

CMMI管理流程—配置管理计划

1. 人员及职责 提示&#xff1a; &#xff08;1&#xff09;根据《项目计划》中的角色分配&#xff0c;确定配置管理员&#xff0c;CCB&#xff08;配置控制委员会&#xff09;成员。 &#xff08;2&#xff09;CCB的人数根据项目规模而定。一般地&#xff0c;项目经理是CCB…

全注解下的SpringIoc

Spring架构中的核心理念就是IOC和AOP&#xff0c;可以说&#xff0c;Spring的强大离不开这两大特性。 因为spring boot推荐采用注解开发&#xff0c;所以文中主要介绍基于注解的Spring Ioc。 IoC容器简介 Spring IoC 容器是个管理 Bean&#xff08;在Spring 中把每个需要管理…