类(初学)(4)

警告:本文是用来学习有关类的知识点,由于初学,所以必会犯很多错误,请大家酌情观看

1、运算符重载

使用重载运算符的一般格式如下:

函数类型 operator 运算符名称(形参表列)
{
	对运算符的重载处理
}

举例:
int operator +(int a,int b)
{
	return (a - b);
}+号重载新功能,使两个整数使用+号后,返回值为两者相减

再举个例子:使用类实现复数加法
如:(3, 4i) + (5, -10i) = (8, -6i)

当我们不知道 运算符重载 的情况会如下做:

#include <iostream>
class Complex //复数-类
{
	public:
		Complex(); //默认参数
		Complex(double i,double j); //类重载
		Complex complex_add(Complex &d); //复数相加函数,返回值为类对象,参数为类对象的地址
		void print();
	private:
		double a,b;
};

Complex::Complex()
{
	a = 0;
	b = 0;
}

Complex::Complex(double i,double j)
{
	a = i;
	b = j;
}

Complex Complex::complex_add(Complex &d) //看起来复杂,但实质是返回值为类对象的函数
{
	Complex c;
	
	c.a = a + d.a; //为什么可以这样写呢?等等会讲到
	c.b = b + d.b;
	return c;
}

void Complex::print()
{
	std::cout<<"("<<a<<","<<b<<"i)\n";
}

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	c3 = c1.complex_add(c2);
	std::cout<<"c1 = ";
	c1.print();
	std::cout<<"c2 = ";
	c2.print();
	std::cout<<"c1 + c2 = ";
	c3.print();
	return 0;
}
output:
c1 = (3,4i)
c2 = (5,-10i)
c1 + c2 = (8,-6i)

c3 = c1.complex_add(c2) 的左值是类对象,右值是类对象调用 complex_add( ) 函数,函数参数是另一个类对象,而在 complex_add( ) 函数中 c.a = a + d.a,左值是 函数要返回的 类对象调用的数据成员,右值是参数(int 型)+ 类对象调用的数据成员

但我们学了 运算符重载 后可以这样写

#include <iostream>
class Complex
{
	public:
		Complex();
		Complex(double i,double j);
		Complex operator +(Complex &d); //变化 :改为运算符重载
		void print();					//但是为什么可以只代入一个参数呢?等等也会讲到
	private:
		double a,b;
};

Complex::Complex()
{
	a = 0;
	b = 0;
}

Complex::Complex(double i,double j)
{
	a = i;
	b = j;
}

Complex Complex::operator +(Complex &d)
{
	Complex c;
	
	c.a = a + d.a;
	c.b = b + d.b;
	return c;
}

void Complex::print()
{
	std::cout<<"("<<a<<","<<b<<"i)\n";
}

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	c3 = c1 + c2;
	std::cout<<"c1 = ";
	c1.print();
	std::cout<<"c2 = ";
	c2.print();
	std::cout<<"c1 + c2 = ";
	c3.print();
	return 0;
}

可能大家会有这样的疑问:+ 运算符是双目运算符,为什公上面的代码片中的 运算符重载函数 只有一个参数呢?实际上,运算符重载函数有两个参数,但由于 运算符重载函数 是 Complex类 中的成员函数,所以有一个参数是隐含着的,运算符函数是用this指针隐式地访问类对象的成员

并且 c3 = c1 + c2 其实被编译系统解释为 c1.operator +(c2)

我们还可以再改进(简化 运算符重载 函数)( 运算符重载 作为友元类)

#include <iostream>
class Complex
{
	public:
		Complex();
		Complex(double i,double j);
		friend Complex operator +(Complex &c,Complex &d); //将 运算符重载 作为友元类
		void print();
	private:
		double a,b;
};

Complex::Complex()
{
	a = 0;
	b = 0;
}

Complex::Complex(double i,double j)
{
	a = i;
	b = j;
}

Complex operator +(Complex &c,Complex &d) //注意,这里作为友元函数,不属于Complex,所以不用写 ::(域运算符)  
{
	return Complex(c.a+d.a,c.b+d.b); //因为是友元类,故可以访问 Complex类 的 private
}

void Complex::print()
{
	std::cout<<"("<<a<<","<<b<<"i)\n";
}

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	c3 = c1 + c2;
	std::cout<<"c1 = ";
	c1.print();
	std::cout<<"c2 = ";
	c2.print();
	std::cout<<"c1 + c2 = ";
	c3.print();
	return 0;
}

补充:

在这里插入图片描述

下一章:类(初学)(5)

发布了92 篇原创文章 · 获赞 35 · 访问量 6369

猜你喜欢

转载自blog.csdn.net/CourserLi/article/details/103663196