c++进阶篇(一)——运算符重载

什么是运算符重载

运算符重载:用同一个运算符完成不同的运算功能。
C++运算符重载的相关规定如下:
1.不能改变运算符的优先级。
2.不能改变运算符的结合性。
3.默认参数不能和重载的运算符一起使用,也就是说,在设计运算符重载成员函数时不能使用默认函数。
4.不能改变运算符的操作数的个数。
5.不能创建新的运算符,只有已有运算符可以被重载
6.运算符作用于C++内部提供的数据类型时,原来含义保持不变

相关代码

  • 关系运算符重载
#include <iostream>

using namespace std;

class Girl
{
private:
    int age;
    int figure;
    int yanzhi;
public:
    Girl(int a,int b,int c):age(a),figure(b),yanzhi(c)
    {}
    int Sum(const Girl& g1)
    {
        return age+figure+yanzhi;
    }
    bool operator < (const Girl& g1)
    {
        if(Sum(g1)<Sum(*this))
        {
            return true;
        }
        return false;
    }

    bool operator == (const Girl& g1)
    {
        if(Sum(g1)==Sum(*this))
        {
            return true;
        }
        return false;
    }

    bool operator >(const Girl& g1)
    {
        if(Sum(g1)>Sum(*this))
        {
            return true;
        }
        return false;
    }
};

int main()
{
    Girl g1(18,90,80),g2(17,80,80);
    if(g1<g2)
    {
        cout<<"g1 is better"<<endl;
    }
    if(g1==g2)
    {
        cout<<"g1 is equal to g2"<<endl;
    }
    if(g1>g2)
    {
        cout<<"g1 is better"<<endl;
    }
    return 0;
}
  • 左移运算符
    注意::左移运算符的重载函数不能作为成员函数,如果想调用类的私有成员需要使用友元函数
#include <iostream>

using namespace std;

class Girl
{
private:
    int age;
    string sex;
    string name;
public:
    Girl(int a,string b,string c):age(a),sex(b),name(c)
    {}
    friend ostream& operator <<(ostream& os,const Girl& g);//重载左移运算符
};

ostream& operator <<(ostream& os,const Girl& g)
{
    cout<<g.age<<g.sex<<g.name;
    return os;
} 


int main()
{
    Girl g(18,"女","小美");
    cout<<g<<endl;
    return 0;
}
  • 下标运算符
#include <iostream>
#include <vector>

using namespace std;

class girl
{
private:
    int age;
    string sex;
    string name;
    vector<string> boys;
public:
    girl(int a,string s,string n,vector<string> b)
    {
        age=a;
        sex=s;
        name=n;
        boys=b;
    }
    void operator[](int i)
    {
        if(i>boys.size()-1)
        {
            cout<<"error"<<endl;
            return;
        }
        cout<<boys[i]<<endl;
    }
};

int main()
{
    girl g(18,"girl","xiaohong",{"xiaoming","xiaohong"});
    g[0];
    g[1];
    g[2];//error
    return 0;
}
  • 赋值运算符
    注意: 系统自带的默认赋值函数是浅拷贝,如果类中成员有使用了堆区内存则需要自己重载赋值运算符
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class Girl
{
public:
    int age;
    string sex;
    string name;
    int* m_ptr;
    Girl()
    {
        m_ptr = nullptr;
    }
    //重载赋值运算符
    Girl& operator=(const Girl& g)
    {
        if(this==&g)
        {
            return *this;
        }
        if(g.m_ptr==nullptr)
        {
            if(m_ptr!=nullptr)
            {
                delete m_ptr;
                m_ptr = nullptr;
            }
        }
        else
        {
            if(m_ptr==nullptr)
            {
                m_ptr = new int;
            }
            memcpy(g.m_ptr, m_ptr, sizeof(int));
        }
        age=g.age;
        sex=g.sex;
        name=g.name;
        return *this;
    }

    void print()
    {
        cout<<"age:"<<age<<endl;
        cout<<"sex:"<<sex<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"*m_ptr:"<<*m_ptr<<endl;
        cout<<"m_ptr:"<<m_ptr<<endl;
        cout<<endl;
    }
};

int main()
{
    Girl g1;
    g1.age=18;
    g1.sex="girl";
    g1.name="xiaohong";
    g1.m_ptr = new int(100);
    g1.print();

    Girl g2;
    g2=g1;
    g2.print();
    return 0;
}
  • 內存分配符(new和delete)
    注意:这里虽然没有使用static关键字,但是这里对newdelete的重载函数属于类的静态成员函数,它并不能访问类的非静态成员。
#include <iostream>

using namespace std;

class girl
{
private:
    int age;
    int bh;

public:
    girl(int a, int b) : age(a), bh(b)
    {
        cout << "构造函数" << endl;
    }
    ~girl()
    {
        cout << "析构函数" << endl;
    }
    void *operator new(size_t size)
    {
        cout << "operator new" << endl;
        return malloc(size);
    }

    void operator delete(void *p)
    {
        cout << "operator delete" << endl;
        free(p);
    }
};

int main()
{
    girl *p = new girl(18, 170);
    delete p;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557264.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MinIO + Prometheus + Grafana docker部署

文章目录 说明MinIO简介MinIO 容器化部署Prometheus服务地址配置方法一&#xff1a;先部署后修改方法二&#xff1a;部署时修改compose文件&#xff08;未验证&#xff09; MinIO Access Key配置Prometheus 容器化部署MinIO 生成抓取配置修改Prometheus配置文件Grafana 容器化部…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

在线编辑器 CodeMirror

如何优雅的在网页显示代码 如果开发在线编辑器 引入资源&#xff1a; <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.60.0/codemirror.min.css"><script src"https://cdnjs.cloudflare.com/ajax/libs/c…

【网安小白成长之路】8.sql注入操作1

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

店前台安装水离子雾化壁炉前和装后对比

当酒店前台装上水离子雾化壁炉后&#xff0c;整体氛围和客户体验都会发生显著的变化&#xff1a; 装前&#xff1a; 普通的前台氛围&#xff1a;前台可能显得比较普通和传统&#xff0c;可能缺乏独特的装饰元素或视觉焦点。 视觉上缺乏吸引力&#xff1a;前台空间可能比较朴…

现代商业中首席人工智能官(CAIO)的角色与影响

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

万字总结!Docker简介及底层关键技术剖析

本文首发在个人博客上&#xff1a;万字总结&#xff01;Docker简介及底层关键技术剖析 Docker 简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#x…

PVE grub resue错误修复 lvmid BUG

服务器断电后启动不起来&#xff0c;显示grub resue 找了半天没有找到修复方法。看官方文档有一处Recovering from grub “disk not found” error when booting from LVM 极为类似。https://pve.proxmox.com/wiki/Recover_From_Grub_Failure 下面是处理过程。 使用PVE 6.4启…

使用示例解释.NET中的Mocking是什么?

让我们踏上探索.NET软件开发中Mocking概念的旅程&#xff0c;让我们深入了解Mocking是多么简单易懂、易于访问。请与我一起穿越这个主题&#xff0c;我将涵盖以下内容&#xff1a; 理解Mocking&#xff1a;为何它对于构建强大的测试策略至关重要。探索一些最常见的Mocking库&a…

python教学入门:字典和集合

字典&#xff08;Dictionary&#xff09;&#xff1a; 定义&#xff1a; 字典是 Python 中的一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。字典使用花括号 {} 定义&#xff0c;键值对之间用冒号 : 分隔&#xff0c;每对键值对之间用逗号 …

SQL-Oracle 获取最大值,第二大,第三大,第 N 大值

目录 1、原始数据2、获取最大值记录3、获取第二大值记录4、获取第三大值记录 1、原始数据 select * from test_2024_04_15_001 order by 销量 desc,渠道2、获取最大值记录 select 渠道,销量 from ( select a.渠道, a.销量 from test_2024_04_15_001 a order by a.销量 desc,…

AI边坡监测识别摄像机

AI边坡监测识别摄像机是一种利用人工智能技术进行边坡监测的智能设备&#xff0c;其作用是及时监测边坡变化并识别潜在的滑坡、崩塌等危险情况&#xff0c;以提供及时预警和采取必要的安全措施。这种摄像机通过高清摄像头实时捕捉边坡的图像&#xff0c;并利用AI算法对边坡的形…

实验室三大常用仪器2---函数信号发生器的基本使用方法(笔记)

目录 函数信号发生器的基本使用方法 如何连接函数信号发生器和示波器 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器3---交流毫伏表的使用方法&#xff08;笔记&#xff09;-CSDN博客 示波器是用来显示和测量信号的…

Java | Leetcode Java题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int n nums.length;int left 0, right n - 1, ans n;while (left < right) {int mid ((right - left) >> 1) left;if (target < nums[mid]) {ans mi…

阿里云图片处理之 图片样式(裁剪)

文档 : https://help.aliyun.com/zh/oss/user-guide/image-styles?spma2c4g.11186623.0.0.5961fe7aq3111v 需求 : 由于客户端界面展示的图片较多, 而且每个图片都过大并且高清高分辨率的, 导致打开页面时图片加载很慢, 而且是缩略图, 对图片清晰度要求不是那么得高, 因此可以…

ASP.NET MVC企业级程序设计 (商品管理:小计,总计,删除,排序)

目录 效果图 实现过程 1创建数据库 2创建项目文件 3创建控制器&#xff0c;右键添加&#xff0c;控制器 ​编辑 注意这里要写Home​编辑 创建成功 数据模型创建过程之前作品有具体过程​编辑 4创建DAL 5创建BLL 6创建视图&#xff0c;右键添加视图 ​编辑 7HomeCont…

【问题处理】银河麒麟操作系统实例分享,adb读写缓慢问题分析

1.问题环境 处理器&#xff1a; HUAWEI Kunpeng 920 5251K 内存&#xff1a; 512 GiB 整机类型/架构&#xff1a; TaiShan 200K (Model 2280K) BIOS版本&#xff1a; Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

Spring Security详细学习第一篇

Spring Security 前言Spring Security入门编辑Spring Security底层原理UserDetailsService接口PasswordEncoder接口 认证登录校验密码加密存储退出登录 前言 本文是作者学习三更老师的Spring Security课程所记录的学习心得和笔记知识&#xff0c;希望能帮助到大家 Spring Sec…

buuctf——[ZJCTF 2019]NiZhuanSiWei

buuctf——[ZJCTF 2019]NiZhuanSiWei 1.绕过file_get_contents()函数 file_get_contents函数介绍 定义和用法 file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持&#xff0c;还会使用内存映射…

python实现将数据标准化到指定区间[a,b]+正向标准化+负向标准化

目录 一、公式介绍 (一)正向标准化公式 (二)负向标准化公式如下 (三)[a,b]取[0,1]的特例 二、构建数据集 三、自定义标准化函数 四、正向标准化 五、负向标准化 六、合并数据 一、公式介绍 将一列数据X标准化到指定区间[a,b] (一)正向标准化公式 nor_X(b-a)*(X-X_…
最新文章