C++学习笔记(十六) 双目运算符重载 静态成员函数 友元 const形参


学习要点:

1 静态成员函数的声明与使用

若在类外实现 static不应带出去。

2 双目运算符重载,内部函数形式和友元形式

3 注意函数参数若可以是常量或临时变量,需要加const

4 友元函数的使用。

若友元函数在类外实现,friend不应带出去。

5 返回值若可以建匿名对象就使用匿名对象吧,编译器会进行优化,不再建立临时变量,直接建立接收返回值的新对象。

若接收返回值的不是新对象,则没有优化。

下篇具体说。


//约分
#include <iostream>
using namespace std;
class F
{
	int n;
	int d;
	void reduce()
	{
			int mcd  = maxcd(n<0?-n:n,d);
			if(mcd !=1 ) 
			{
				n/=mcd;
				d/=mcd;
			}
	}
	

public:
	F(int n=0,int d=1):n(n),d(d)
	{
		cout << "F(" << this->n << "," << this->d <<")" <<endl;
		//注意 这个范围内到n d都是形参,要访问成员要this->
		if(this->d==0) throw "分母不可以为0"; 
		if(this->d<0)
		{
				this->d=-this->d;
				this->n = -this->n;
		}
		reduce();
	}
	
	static int maxcd(int a,int b) //静态成员函数   不依赖某个对象  不能用this 调用时不传对象地址
	{
		if(a==0)  return b;
		return maxcd(b%a,a);
	}
/*
	//内部操作 操作数减少一个
	F operator+(const F& f)
	{
		int fenmu = this->d * f.d;
		int fenzi = this->n* f.d + this->d * f.n;
		F res(fenzi,fenmu);
		return res;
	}
*/
	//在下面写成友元形式

	//引用常量 或者 临时值 必需要有const !!!!重要
	
	//若不加const ,f1+f2 无问题 ,f1+f2 返回值是临时变量,f1+f2+f3就会出问题。
	friend F operator+(const F& a,const F& b)
	{
		F res(a.d * b.d , a.n * b.d + a.d *b.n);
		return res;
	}
	
	//成员比非成员函数少一个操作数
	F operator*(const F& x)
	{
		/*
		F res(n*x.n,d*x.d);
		return res;
		*/
		return F(n*x.n,d*x.d); //返回一个匿名对象  类名(参数);
		//匿名对象是有好处的,编译器 会通过优化提高效率,直接创建返回的临时变量。
	}
	
	//若不加const,cout << f1 无问题 ,cout << f1+f2 就会出问题,因为f1+f2返回的是临时变量
	friend ostream& operator<<(ostream&  out, const F &f); //友元就更不能用this了
};


//friend关键字  不用写在类外面。
 ostream& operator<<(ostream& out, const F &f)
{
	out << f.n << "/" << f.d ;
	return out;
}



int main()
{
	F f1;//0
	F f2(3); //3
	F f3(6,12); //1/2
	// F f4(5,0); //terminate called after throwing an instance of 'int'
	F f5(3,9);// 1/3
	cout << f5 << endl;
	
	//静态成员函数调用
	cout << "F::maxcd(52,16)  = "<<F::maxcd(52,16) <<endl;
	
	//操作符重载
	cout << f3 << endl;
	cout << f3+f5+f2 <<endl;
	cout << f2*f3 <<endl;
	
	
}


求最大公约数

辗转相除法是古希腊求两个正整数的最大公约数的,也叫 欧几里德算法,其方法是用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数。以求288和123的最大公约数为例,操作如下:
288÷123=2余42
123÷42=2余39
42÷39=1余3
39÷3=13
所以3就是288和123的最大公约数。

你可能感兴趣的:(C++学习笔记(十六) 双目运算符重载 静态成员函数 友元 const形参)