int 运算符重载

手写int128,重载运算符,函数 今天做了一个题,需要用到高精度,但是数据范围在2^128以内,所以就想到手写模拟int128,之后重载运算符和函数,真的嘎嘎爽; 那么我先介绍一下int128吧,大家都知道int是4个字节,long long是八个字节,当数据大过10^18以后就要用到高精度了,在数据并不是太大,而是在2^128以内的时候就可以用到int128了; int128的定义 struct int128{ long long hig;//储存高位 long long low;//储存 阅读详情

为了更深入的理解返回引用和对象,以及运算符重载,做了int的运算符重载:
这里写图片描述
这里写图片描述

#include <iostream>

using namespace std;

class Int;

ostream& operator<<(ostream &out, const Int &i);

class Int
{
    friend ostream& operator<<(ostream &out, const Int &i);
public:
    Int(int i = 0) : m_i(i)
    {}
    ~Int()
    {}
public:
    Int operator+(const Int &i);
    Int operator-(const Int &i);
    Int operator*(const Int &i);
    Int operator/(const Int &i);
    Int operator+=(const Int &i);
    Int operator-=(const Int &i);
    Int operator*=(const Int &i);
    Int operator/=(const Int &i); 
    Int operator%(const Int &i);
    Int operator^(const Int &i);
    Int operator%=(const Int &i);
    Int operator^=(const Int &i);
    Int& operator++();  //前置++
    Int operator++(int);  //后置++
    Int& operator--();
    Int operator--(int);

    Int& operator+();   //正a
    Int& operator-();   //负a
    Int& operator~();   //取反
    Int& operator!();   //取非

    Int& operator>>(int n);  //右移
    Int& operator<<(int n);  //左移
    Int& operator>>=(int n);   //右移等
    Int& operator<<=(int n);   //左移等

    bool operator>(const Int &i);
    bool operator<(const Int &i);
    bool operator>=(const Int &i);
    bool operator<=(const Int &i);
    bool operator==(const Int &i);
    bool operator!=(const Int &i);

    Int operator&(const Int &i);  //与运算(位)
    Int operator|(const Int &i);  //或运算(位)

    bool operator&&(const Int &i);
    bool operator||(const Int &i);

private:
    int m_i;
};

ostream& operator<<(ostream &out, const Int &i)
{
    out << (i.m_i);
    return out;
}

Int Int::operator+(const Int &i)
{
    return Int(m_i + i.m_i);
}

Int Int::operator-(const Int &i)
{
    return Int(m_i - i.m_i);
}

Int Int::operator*(const Int &i)
{
    return Int(m_i * i.m_i);
}

Int Int::operator/(const Int &i)
{
    return Int(m_i / i.m_i);
}

Int Int::operator+=(const Int &i)
{
    return Int(m_i += i.m_i);
}

Int Int::operator-=(const Int &i)
{
    return Int(m_i -= i.m_i);
}


Int Int::operator*=(const Int &i)
{
    return Int(m_i *= i.m_i);
}

Int Int::operator/=(const Int &i)
{
    return Int(m_i /= i.m_i);
}

Int Int::operator%(const Int &i)
{
    return Int(m_i % i.m_i);
}

Int Int::operator^(const Int &i)
{
    return Int(m_i ^ i.m_i);
}

Int Int::operator%=(const Int &i)
{
    return Int(m_i %= i.m_i);
}

Int Int::operator^=(const Int &i)
{
    return Int(m_i ^= i.m_i);
}

Int& Int::operator++()  //前置++
{
    m_i++;
    return *this;
}

Int Int::operator++(int)  //后置++
{
    Int tmp(m_i);
    m_i  += 1;
    return tmp;
}

Int& Int::operator--()   //前置--
{
    m_i--;
    return *this;
}

Int Int::operator--(int)   //后置--
{
    Int tmp(*this);
    m_i -= 1;
    return tmp;
}

Int& Int::operator+()   //正a
{
    m_i = +m_i;
    return *this;
}

Int& Int::operator-()   //负a
{
    m_i = -m_i;
    return *this;
}

Int& Int::operator~()   //取反
{
    m_i = ~m_i;
    return *this;
}

Int& Int::operator!()   //取非
{
    m_i = !m_i;
    return *this;
}

Int& Int::operator>>(int n)  //右移
{
    m_i = (m_i >> n);
    return *this;
}

Int& Int::operator<<(int n)  //左移
{
    m_i = (m_i << n);
    return *this;
}

Int& Int::operator>>=(int n)   //右移等
{
    m_i >>= n;
    return *this;
}

Int& Int::operator<<=(int n)   //左移等
{
    m_i <<= n;
    return *this;
}

bool Int::operator>(const Int &i)
{
    return m_i > i.m_i;
}

bool Int::operator<(const Int &i)
{
    return m_i < i.m_i;
}

bool Int::operator>=(const Int &i)
{
    return m_i >= i.m_i;
}

bool Int::operator<=(const Int &i)
{
    return m_i <= i.m_i;
}

bool Int::operator==(const Int &i)
{
    return m_i == i.m_i;
}

bool Int::operator!=(const Int &i)
{
    return m_i != i.m_i;
}

Int Int::operator&(const Int &i)  //与运算(位)
{
    Int tmp;
    tmp.m_i = (m_i & i.m_i);
    return tmp;
}

Int Int::operator|(const Int &i)  //或运算(位)
{
    Int tmp;
    tmp.m_i = m_i | i.m_i;
    return tmp;
}

bool Int::operator&&(const Int &i)
{
    return m_i && i.m_i;
}

bool Int::operator||(const Int &i)
{
    return m_i || i.m_i;
}

int main()
{
    Int i;
    Int i1(1);
    Int i2(2);

    cout << "i1 + i2 = " << i1 + i2 << endl;
    cout << "i1 - i2 = " << i1 - i2 << endl;
    cout << "i1 * i2 = " << i1 * i2 << endl;
    cout << "i1 / i2 = " << i1 / i2 << endl;
    cout << "i1 += 2 = " << (i1 += 2) << endl;

    cout << "i1 -= i2 = " << (i1 -= i2) << endl;
    cout << "i1 *= i2 = " << (i1 *= i2) << endl;
    cout << "i1 /= i2 = " << (i1 /= i2) << endl;

    cout << "i1 % i2 = " << (i1 % i2) << endl;
    cout << "i1 ^ i2 = " << (i1 ^ i2) << endl;
    cout << "i1 %= 1 = " << (i1 %= 1) << endl;
    cout << "i2 ^= 3 = " << (i2 ^= 3) << endl;

    Int i3(1);
    Int i4(1);
    cout << "++i3 = " << ++i3 << endl;
    cout << "i4++ = " << i4++ << endl;
    cout << "--i3 = " << --i3 << endl;
    cout << "i4-- = " << i4-- << endl;

    Int i5(2);
    Int i6(3);
    cout << (i5 == i6) << endl;
    cout << (i5 != i6) << endl;

    cout<< "(i5 <<= 1) = " << (i5 <<= 1) << endl;
    cout<< "(i5 <<= 1) = " << (i5 <<= 1) << endl;
    cout<< "(i6 || 1) = " << (i6 || 1) << endl;
    cout<< "(i6 && 0) = " << (i6 && 0) << endl;
    cout<< "(i6 | 1) = " << (i6 | 1) << endl;
    cout<< "(i6 & 1) = " << (i6 & 1) << endl;
    cout<< "-i6 = " << -i6 <<endl;
    cout<< "~i6 = " << ~i6 <<endl;
    return 0;
}
c++MyArray类(动态数组为int)的运算符重载+,-,*,[] 定义一个MyArray类,内部有私有成员int size和int *ptr。 创建该类对象时,在构造函数中用new动态内存分配一个长度为size的一维整型数组并用ptr成员存储该数组的首地址。析构函数要释放动态数组。 为该类重载以下运算符: (1)下标运算符[ ],利用该下标运算符实现对数组元素的读写访问 (2)赋值运算符,实现MyArray对象之间正确的深层赋值。 (3)+运算符,实现两个MyArray对象的数组的对应元素相加,返回一个新的MyArray对象,该对象的数组中存 阅读详情

相关推荐

C++_类和对象_C++运算符重载_加号运算符重载_实现两个对象相加_对象和int类型相加_通过成员函数重载+号_全局函数重载+号_以及重载_运算符重载函数实现---C++语言工作笔记055

然后我们再来看,运算符的重载,首先我们来看加号的运算符的重载. 这个的作用是很明显的,比如我们有两个Person对象,p1,p2,如果我们想 p3 = p1+p2能可以嘛,不可以对吧,因为系统给我们提供的+ ,只能加上,int类型,double,float等类型的相加, 这个时候,我们就可以重载+运算符,实现两个对象的直接相加. 实现运算符重载,直接相加两个对象,有两种方法,可以看到上面用的是第一种方法, 通过自己写的成员函数实现的.自己写了个PersonAddPerson实现的,这样..

添柴程序猿的专栏 1419

对运算符进行重载【C++】

C++对运算符进行重载

qq_45783047的博客 1155

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 408

c++运算符重载案例---封装int类型、算术运算符重载、位运算符重载、流重载、关系运算符重载、取地址符重载、[ ]重载...

class Int { public: Int(int num) :num(num) {} int&amp; data() { return num; } string tostr() { return to_string(num); } //算术运算符重载 Int operator+(const Int&amp; value) { return Int(this->num + value.num); } //友元重载 :操作数-1 等于重载函数的参数个数 .

weixin_60569662的博客 1057

保姆级教程:用GMT6.1绘制专业地形起伏图(从数据下载到出图避坑)

本文提供了一份详细的GMT6.1绘制地形起伏图的保姆级教程,从环境搭建到数据下载,再到核心绘图命令解析,帮助用户避开常见错误。特别适合科研人员和地理信息爱好者快速掌握专业地形图的绘制技巧,提升工作效率。

weixin_42549723的博客 275

scRNA-seq的fastq文件处理流程——持续更新

获得了一批新的scRNA-seq的fastq.gz文件,每个样本的数据形式为: 我打算使用10X cellranger处理fastq.gz文件,下载及安装方式在官网:https://support.10xgenomics.com/single-cell-gene-expression/software/downloads/2.0这个网址写了10X cellranger处理fastq.gz文件的命名规则https://support.10xgenomics.com/single-cell-gene-expr

watermel__的博客 3198

算术运算符重载——普通函数重载算术运算符

任务描述 Int 类所保存的内容显然是可以进行算术运算的,因此对 Int 类进行算术运算符重载是一件非常自然的事情。 为 Int 类重载算术运算符,以普通函数的形式。 相关知识 运算符重载,相当于一个固定了函数名的函数。以重载加号运算符为例,其函数名就是 operator + 运算符重载不能改变运算符的优先级与结合性,本质上也不能改变参数的数量(即双目运算符重载,必须拥有 2 个形参)。但是,如果以成员函数进行重载,则参数数量需要减一。减掉的那个参数,实际上就是调用该运算符时的类对象。

qq_60786476的博客 6063

CRPR的三种关键影响:从SI、OCV到Min Pulse Width的时序优化实践

本文深入探讨了CRPR(时钟重汇聚悲观度消除)在芯片时序优化中的三种关键影响:信号完整性(SI)、片上变异(OCV)和最小脉宽检查。通过实际案例分析和技术细节,展示了CRPR如何有效修正时序分析中的过度保守估计,提升设计精度。文章特别强调了SI-aware CRPR的调试技巧和OCV补偿的最佳实践,为芯片设计工程师提供了宝贵的时序优化指导。

weixin_30920853的博客 379

C++之函数重载

在C++中可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或参数类型相同 而参数的个数不同, 称为函数重载;函数重载的规则、函数重载的解析步骤

m0_59052131的博客 1228

告别手动操作!用Python脚本批量处理Siemens NX零件文件(导入/导出/移除参数)

本文详细介绍了如何利用Python脚本实现Siemens NX零件文件的批量处理,包括导入、导出和移除参数等操作。通过NX Open API和Python UF接口,工业设计师可以大幅提升工作效率,告别繁琐的手动操作。文章提供了完整的实战指南,涵盖环境配置、核心功能实现以及性能优化技巧,特别适合需要进行Siemens-NXUG二次开发的工程师参考。

weixin_28222493的博客 259

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4951

Int函数运算符重载

用C++编写Int函数来实现基本运算如下: #include using namespace std; class Int { public: Int(int i=0):m_i(i) {} ~Int() {} Int& operator++() //前置++ { m_i++; return *this; } In

罗小黑の窝 1137

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1086

【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 )

一、后置运算符重载 1、前置运算符重载 与 后置运算符重载 的区别 2、后置运算符重载添加 int 占位参数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1200

Qt插件之Qt Designer插件实现

相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。...

yang1fei2的博客 3100

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++自增自减运算符重载int参数的问题

解决为什么自增自减运算符重载带int参数就是后置,不带就是前置的疑问转自:http://dev.yesky.com/228/2578228.shtm很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。   然而有一个句法上的问题,重载函数间的区别决定于它们的参数类...

weixin_41066275的博客 2045

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

重载类型转换运算符double,int,string

#include #include using namespace std; class F { int n; int d; public: F(int n = 0, int d = 1):n(n),d(d) { } //不要返回值 //类型转换运算符函数,将当前对象转成double //double operator double() operator

dongguxidu1的专栏 1523

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

c++重载i++与++i;重载i--与--i;即operator++()与operator++(int);递增++递减--运算符重载

目录前言一、理解二、实现总 结参考 前言 递增运算符( ++ )和递减运算符( – )是 C++ 语言中两个重要的一元运算符。 其实觉得设计的有点鸡肋。。。 一、理解 首先 i++是不能对其取地址的。 因为i++返回的是一个右值。关于左值右值可以看看:–左值与右值– 理解为++i 操作完返回了i 的引用。而i++操作完返回的是操作之前的临时变量。 二、实现 最简单的实现,实验调用机制: int 在 括号内是为了向编译器说明这是一个后缀形式,而不是表示整数。 class fake_int { void

多丰富下自己呀 2014

算术运算符重载——成员函数重载算术运算符

任务描述 Int 类所保存的内容显然是可以进行算术运算的,因此对 Int 类进行算术运算符重载是一件非常自然的事情。 为 Int 类重载算术运算符,以成员函数的形式。 相关知识 算术运算符既可以以成员函数形式重载,也可以以普通函数形式重载。出于某种“对称性”的考虑,一般习惯使用普通函数来重载算术运算符。 需要注意的是,二者取其一。即如果以成员函数形式重载了算术运算符,就不要再以普通函数重载(相同参数的)。反之,亦然。 编程要求 根据提示,在右侧编辑器的Begin-End区域内补充代码。 测试说

qq_60786476的博客 4616

兔子繁殖(int128+重载运算符 处理Fibonacci)

兔子有很强的繁殖能力。1对成年的兔子每个月可以生育一对幼年的兔子,而1对幼年的兔子经过m个月之后,就会长成1对成年的兔子。当一开始有1对成年兔子时,经过d个月以后,共有多少对兔子?你的任务是计算出一对成年兔子经过d个月后,共有多少对兔子,假设整个过程中没有兔子死亡。输入有多组数据,每组占1行,为两个整数m,d(1≤m≤10,1≤d≤100),当m=d=0时表示结束。每行为每组数据对应最后得到的兔子数。

qq_74910785的博客 677

C++运算符重载实战:从Int包装类看赋值与复合赋值的那些坑

本文深入探讨C++运算符重载中的赋值与复合赋值运算符实现技巧,通过Int包装类实例分析常见陷阱与最佳实践。内容涵盖拷贝赋值运算符、复合赋值运算符重载、异常安全处理及现代C++中的移动语义应用,帮助开发者掌握面向对象编程的核心技能。

weixin_33686714的博客 568

C++ 运算符重载 operator++()和operator++(int)的区别

++i; // 调用 i.operator++(); i++; // 调用 i.operator++(int); –i; // 调用 i.operator–(); i–; // 调用 i.operator–(int); 方便记忆:i++:++后面还要接东西就operator++(int) ++i:加号后面有i啦不用加东西了operator++(); 示例: Complex operator++(); //"++" 重载为成员函数 Complex operator--(int); //"--" 重载为成员函数

komorebi123_的博客 436

头歌平台实训指南:用5个关卡彻底搞懂C++运算符重载(含Int类完整代码)

本文详细解析了在头歌平台《程序设计二》实训中,如何通过5个关卡循序渐进地掌握C++运算符重载。文章以Int类为例,从基础的赋值运算符重载入手,深入探讨了类型转换、复合赋值运算符(如+=)以及高效的运算符复用策略(优先实现+=再实现+),并提供了考虑边界情况的完整工业级代码实现,帮助读者不仅通过实训,更深刻理解面向对象设计的核心技巧。

pz89012345的博客 407

【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )

一、下标 [] 运算符重载 1、数组类回顾 2、下标 [] 运算符重载 二、完整代码示例 1、Array.h 数组头文件 2、Array.cpp 数组实现类 3、Test.cpp 测试类 4、执行结果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2370

运算符重载

该教程是参照C++入门经典写的一个学习笔记,仅供参考。 运算符重载 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 探索运算符重载 首先我们创建一个Counter类 #include<iostream> class Counter { public: Counter(); ~Counter(); int getValue() const...

单线程的Daniel的博客 346

自定义类对象的前置、后置运算符的重载

1、初学前后置运算符重载时,就不是很清楚,两者的格式究竟有什么不同,今天代码调试了一下,发现区别就在于: 后置运算符重载时比前置运算符多了一个 int 型的形参,它就是一个标记,用于区别前后置,而且规定一定要是一个 int 型的, 至于返回值是否要返回引用型什么的那是具体情境要考虑的东西,要想区分前后置,主要就是看看是否多了一个无用的int型 2、除了这个无效的int型之外,其他参数还是照常...

我有明珠一颗的博客 618
上一篇: 浅谈TCP(传输控制协议)的可靠性
下一篇: 致自己
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值