程序设计实习MOOC/自增和自减运算符的重载

自增和自减运算符的重载

问题

编写CDemo类,使得下面程序可以正常运行

int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}

输出结果

5,6,7,7
7,6,5,5

分析

自增++自减--运算符有前置和后置之分,为了区分,后置运算符多一个参数int。
前置运算符:作为一元运算符重载,可以重载为成员函数也可以重载为全局函数(返回值到底是不是引用?)。
后置运算符:作为二元运算符重载,多写一个参数int,但是没有实际意义。可以重载为成员函数也可以重载为全局函数。返回值不是引用!不是引用!不是引用!

强调:后置运算符多一个参数int,返回值不是引用。

为了cout可以正常输出,重载类型强制转换运算符int作为成员函数。

类型强制转换运算符重载

不能写返回值类型
实际上其返回值类型为类型强制转换运算符代表的类型

运算符重载的注意事项

  1. C++不允许定义新的运算符
  2. 重载后运算符的含义应该符合日常习惯
  3. 运算符重载不改变运算符的优先级
  4. 以下运算符不能够被重载:. .* :: ?: sizeof
  5. 以下运算符重载是必须声明为类的成员函数:() [] ->
  6. 流提取>>和流插入<<运算符只能重载为全局函数,第一个参数ostream对象必须为引用。

完整代码

#include<iostream>
using namespace std;
class CDemo{
public:
    CDemo(int num = 0):n(num){}
    CDemo operator++();                     //前置++,成员函数
    CDemo operator++(int);                  //后置++,成员函数
    friend CDemo operator--(CDemo&);        //前置--,友元函数
    friend CDemo operator--(CDemo&, int);   //后置--,友元函数
    operator int(){                         //强制类型转换运算符重载
        return n;
    }
//    friend ostream& operator<<(ostream& co, const CDemo& d);
//    friend istream& operator>>(istream& ci, CDemo& d);
private:
    int n;
};
//前置++
CDemo CDemo::operator++(){
    n++;
    return *this;
}
//后置++
CDemo CDemo::operator++(int){
    CDemo temp(*this);
    n++;
    return temp;
}
//前置--
CDemo operator--(CDemo& d){
    d.n--;
    return d;
}
//后置--
CDemo operator--(CDemo& d, int){
    CDemo temp(d);
    d.n--;
    return temp;
}
//ostream& operator<<(ostream& co, const CDemo& d){
//    co << d.n;
//    return co;
//}
//istream& operator>>(istream& ci, CDemo& d){
//    ci >> d.n;
//    return ci;
//}
int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}

afra算法练习
记录编程,慢慢成长

你的努力程度之低 远还没有到比拼天赋的需要。

215 声望
23 粉丝
0 条评论
推荐阅读
【LeetCode】字符串初级算法-验证回文字符串
题目描述 验证回文字符串给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: {代码...} 示例 2: {代码...} 思路 用...

afra阅读 2.5k

程序员适合创业吗?
大家好,我是良许。从去年 12 月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。每个视频都花了很多时间精力用心制作,欢迎大家关注哦~考虑到有些小伙伴没有看过我的视频,...

良许3阅读 1.3k

比cat更好用的命令!
但 cat 命令两个很重大的缺陷:1. 不能语法高亮输出;2. 文本太长的话无法翻页输出。正是这两个不足,使得 cat 只能用来查看行数不多的小文件。

良许2阅读 679

DBoS 系统说明
程序员TianSong以单片机开发入门,后续又做了 Qt 相关工作,有时间后开始进行 linux 相关的学习,恰巧在二一年十一月份,百问网的韦东山老师进行了三个月的 linux 驱动直播,于是有了开发 DBoS 的念头。

TianSong1阅读 1.2k

【Qt】简单桌面
[链接]简介简单桌面是一款小巧便捷的桌面背景管理软件。由编程爱好者个人开发,不收集使用者个人信息、不连接网络、不弹窗。下载功能支持单静态图片及多静态图片轮播(轮播时间可设置)支持GIF动画背景支持视频背...

TianSong3阅读 2.2k

良许翻天覆地的2022年
大家好,我是良许,新年快乐呀~在我女室友坚持不懈的努力之下,2022年的最后一天我终于被她传染了,阳了~此时的我,正顶着37多度的低烧写下这篇年终总结。2022年,对于大多数人而言,封控是主旋律——不停地核酸,...

良许2阅读 773评论 1

一个Bug让人类科技倒退几十年?
大家好,我是良许。前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。1. 全世界的恐慌一...

良许阅读 1.4k

你的努力程度之低 远还没有到比拼天赋的需要。

215 声望
23 粉丝
宣传栏