C++入门学习:运载符的重载(+,-,++,--)

对于运算符的操作数,编译器只能识别基础的数据类型,如果要使用符合的数据类型(如结构体),则需要对运算符的操作数进行拓展是运算符支持复合数据类型,C++中的运算符重载就解决了这一问题。

运算符函数定义的一般格式如下:

数据类型  operator<运算符符号>(参数列表)
{
        <函数体>

}

有一些特殊的运算符不能被重载:域解析符(::),条件运算符(?:),直接成员访问运算符(.),类成员指针引用运算符(.*),sizeof运算符(sizeof)

运算符重载分为类的内部方式和全局方式,同一种运算符,全局和内部方式只能存在一种。当无法修改左操作数的类时,使用全局函数进行重载

eg:计算虚数

class Complex
{
friend Complex operator+(Complex &c1, Complex &c2);//使用到类的私有变量,需要设为友元函数
friend Complex operator+(Complex &c1, int num);
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}

void show()
{
printf("%d + %di\n", a, b);

}

        Complex add(Complex &c)//Complex add(Complex*const this, Complex &c)
{
Complex tmp(a+c.a, b+c.b);
return tmp;
}


Complex operator-(Complex &c)//Complex operator-(Complex*const this, Complex &c)
{
Complex tmp(a-c.a, b-c.b);
return tmp;
}

private:
int a;//实部
int b;//虚部

};

//全局方式:加法运算符的重载:对象+对象
Complex operator+(Complex &c1, Complex &c2)
{
Complex tmp(c1.a+c2.a, c1.b+c2.b);
return tmp;

}

//全局方式:加法运算符的重载:对象+常量
Complex operator+(Complex &c1, int num)
{
Complex tmp(c1.a+num, c1.b);
return tmp;

}

//全局方式:全局函数重载运算符
int main()
{
Complex c1(1,2), c2(3,4), c3;
cout << "c1 = 1+2i; c2 = 3+4i" << endl;
cout << "全局方式" << endl;
//编译器不知道如何运算自定义类型,所以不允许直接进行运算
//需要自己写运算规则,写执行函数
// 1.编译器发现c1和c2是自定义类型
// 2.它们要进行 + 运算
// 3.调用函数执行相应的功能: operator+(c1,c2)
// 4.如果存在operator+(c1,c2)则执行成功,如果不存在则报错

c3 = c1+c2;                    // operator+(c1,c2) 对象+对象
cout << "operator+(c1,c2):";
c3.show();

c3 = c1 + 10;                  // operator+(c1, 10)  对象+常量
cout << "operator+(c1, 10):";
c3.show();
return 0;

}


//内部方式:类的内部成员(函数) 
int main()
{
Complex c1(1,2), c2(3,4), c3;
cout << "c1 = 1+2i; c2 = 3+4i" << endl;
cout << "内部方式" << endl;
c3 = c1.add(c2);/* add省略参数c1,因为调用的是c1中的add函数,
对象c1中有this指针可提供c1的地址,
等价于 add(&c1, c2) =====>c1 + c2*/

c3 = c2.add(c1);//add(&c2, c1)=====>c2 + c1, 参数顺序要清楚,在- * /运算时会影响结果

cout << "c3 = c1 - c2" << endl;
c3 = c1 - c2;                          // c1.operator-(c2) =====>  operator-(&c1, c2)
cout << "operator-(&c1, c2):";
c3.show();


cout << "c3 = c2 - c1" << endl;
c3 = c2 - c1;                    // c2.operator-(c1) =====> operator-(&c2, c1)
cout << "operator-(&c2, c1):";
c3.show();

return 0;

}

单目运算符的重载(++,--)

#include <iostream>

using namespace std;
class Complex
{
	friend Complex& operator++(Complex &c);//++i
	friend Complex operator++(Complex &c, int);//i++
public:
	Complex(int a = 0, int b = 0)
	{
		this->a = a;
		this->b = b;
	}

	void show()
	{
		printf("%d + %di\n", a, b);
	}

	Complex operator+(Complex &c)
	{
		Complex tmp(a+c.a, b+c.b);
		return tmp;
	}

	Complex& operator--()
	{
		--a;
		--b;
		return *this;
	}

	Complex operator--(int)
	{
		Complex tmp = *this;
		a--;
		b--;
		return tmp;
	}
private:
	int a;
	int b;
};

//++i
Complex& operator++(Complex &c)
{
	++c.a;
	++c.b;
	return c;
}

//i++
//区分前置++和后置++:通过一个int型占位参数来区分, 后置++函数中有一个int型的占位参数
Complex operator++(Complex &c, int)
{
	Complex tmp = c;
	c.a++;
	c.b++;
	return tmp;
}

//--
int main3()
{
	Complex c1(1,2), c2(3,4), c3;
	//c3 = --c1 + c2;
	c3 = c1-- + c2;
	c1.show();
	c3.show();
	return 0;
}


//后置++运算符
int main2()
{
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值