首页 > 其他分享 >34.前置加加和后置加加(错误)

34.前置加加和后置加加(错误)

时间:2022-10-13 14:47:55浏览次数:42  
标签:加加 return 后置 ++ 34 -- int operator

1.前置和后置(++/--)运算符重载

  重载的++和--运算符有点让人不知所措,因为我们总是希望能根据它们出现在所作用对象的前面还是后面来调用不同的函数。解决办法很简单,例如当编译器看到++a(前置++),它就调用operator++(a),当编译器看到a++(后置++),它就会去调用operator++(int).

class Complex{
	friend ostream& operator<<(ostream& os,Complex& complex){
		os << "A:" << complex.mA << " B:" << complex.mB << endl;
		return os;
	}
public:
	Complex(){
		mA = 0;
		mB = 0;
	}
	//重载前置++
	Complex& operator++(){
		mA++;
		mB++;
		return *this;
	}
	//重载后置++
	Complex operator++(int){	
		Complex temp;
		temp.mA = this->mA;
		temp.mB = this->mB;
		mA++;
		mB++;
		return temp;
	}
	//前置--
	Complex& operator--(){
		mA--;
		mB--;
		return *this;
	}
	//后置--
	Complex operator--(int){
		Complex temp;
		temp.mA = mA;
		temp.mB = mB;
		mA--;
		mB--;
		return temp;
	}
	void ShowComplex(){
		cout << "A:" << mA << " B:" << mB << endl;
	}
private:
	int mA;
	int mB;
};

void test(){
	Complex complex;
	complex++;
	cout << complex;
	++complex;
	cout << complex;

	Complex ret = complex++;
	cout << ret;
	cout << complex;

	cout << "------" << endl;
	ret--;
	--ret;
	cout << "ret:" << ret;
	complex--;
	--complex;
	cout << "complex:" << complex;
}

2.视频内容

程序1:

#pragma warning(disable:4996)
//2022年10月12日22:09:19
#include <iostream>
using namespace std;

void test01()
{
    int a = 1;
    cout << ++a << endl;
    cout << a++ << endl;
    cout << a << endl;

    ++(++a);
}

class Maker
{
    friend ostream &operator<<(ostream &out, Maker &m);
public:
    Maker(int a)
    {
        this->a = a;
    }
    //重载前置加加
    //Maker &operator++()
    //{
    //    this->a = a;
    //}
    //后置加加
    //Maker &operator++()
    //{
    //    ++this->a;
    //    return *this;
    //}
private:
    int a;
};

ostream &operator<<(ostream &out, Maker &m)
{
    out << m.a << endl;
    return out;
}

void test02()
{
    Maker m1(1);
    cout << m1 << endl;
    //cout << ++m1 << endl;
    //++(++m1);
}
int main()
{
    test02();
    system("pause");
    return EXIT_SUCCESS;
}

输出结果:

1

请按任意键继续. . .

程序2:

55行出现错误
错误 C2679 二元“<<”: 没有找到接受“Maker”类型的右操作数的运算符(或没有可接受的转换) 10前置加加和后置加加

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

void test()
{
    int a = 1;
    cout << ++a << endl;
    cout << a++ << endl;
    cout << a << endl;

    ++(++a);
}

class Maker
{
    friend ostream &operator<<(ostream &out, Maker &m);
public:
    Maker(int a)
    {
        this->a = a;
    }
    //重载前置加加
    Maker &operator++()
    {
        ++this->a;
        return *this;
    }

    //后置加加,
    Maker operator++(int)//占位参数,必须是int
    {
        //后置加加,先返回,后加加
        Maker tmp(*this);//1.*this里面的值a是等于2
        ++this->a;//这个对象的a等3
        return tmp;
    }
private:
    int a;
};

ostream &operator<<(ostream &out, Maker &m)
{
    out << m.a << endl;
    return out;
}

void test02()
{
    Maker m1(1);
    cout << m1 << endl;//1
    cout << ++m1 << endl;//2
    //++(++m1);
    cout << m1++ << endl;//2  这里返回的拷贝的tmp对象
    cout << m1 << endl;//3 这里返回的是++this->a的对象

    //同等条件下,优先使用前置加加,不需要产生新的对象和调用拷贝构造

}

int main()
{
    test02();
    system("pause");
    return EXIT_SUCCESS;
}

标签:加加,return,后置,++,34,--,int,operator
From: https://www.cnblogs.com/codemagiciant/p/16788080.html

相关文章

  • MDK5.29,5.30,5.31,5.32,5.33, 5.34,5.35, 5.36, 5.37和各种pack软件包镜像下载(2022-05-04)
    MDK5.29,5.30,5.31,5.32,5.33,5.34,5.35,5.36,5.37和各种pack软件包镜像下载(2022-05-04) MDK软件:​​​mdk454.exe​​​(491.23MB)​​​mdk474.exe​​​(576.82MB)​​​......
  • Luogu P3469 [POI2008]BLO-Blockade
    [P3469POI2008]BLO-Blockade-洛谷|计算机科学教育新生态(luogu.com.cn)图\(G\)本身联通。删除\(u\)的连边后会形成\(k\ge2\)个连通块(至少会把\(u\)隔离出......
  • uoj34 多项式乘法 ntt
    ​​http://www.elijahqi.win/2018/03/17/uoj34ntt/​​​这是一道模板题。给你两个多项式,请输出乘起来后的多项式。输入格式第一行两个整数nn和mm,分别表示两个多项......
  • 134 . Eclipse 简单配置和使用
    134.Eclipse简单配置和使用常用视图Packageexplorer包视图Navigator导航视图Outline结构视图Consoles控制台视图字符集设置Window-Preferen......
  • comp3411-prolog辅导(一)基础知识
    本文介绍的prolog内容如下:如果没有Linux环境的话,建议在浏览器的在线网页中学习prolog。文章目录​​1.install​​​​2.introduction​​​​3.variables​​​​4.if......
  • comp3411辅导assignment2
    文章目录​​1内容分析​​​​1.1​​​​1.2模拟机器人​​​​1.2.1代码使用​​​​1.1.4test1成功,深度优先​​​​1.1.3test2失败,也就是说,深度优先失败的原因​......
  • 洛谷 P3488 [POI2009]LYZ-Ice Skates 题解
    错解每次跑二分图匹配,时间复杂度显然爆炸。时间复杂度:我被杀手皇后摸过了正解引入Hall定理:设二分图中\(G=<V_1,V_2,E>,|V_1|\le|V_2|\),则G中存在\(V_1\)到......
  • leetcode349.两个数组的交集
    1.题目描述给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。2.示例示例1:输入:nums1=[1,2,2,......
  • 34、mysql数据库(介绍)
    34.1、什么是数据库:数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性......
  • HTTP.sys远程执行代码(CVE-2015-1635)(MS15-034)
    发现一个http.sys告警信息,这里复现一下,增加知识储备这里参考了这位师傅的文章https://blog.csdn.net/qq_41210745/article/details/103437683漏洞详情IIS服务进程依赖H......