1. 程式人生 > >過載運算子和過載函式

過載運算子和過載函式

過載運算子

可過載運算子/不可過載運算子

下面是可過載的運算子列表:
可過載運算子列表

下面是不可過載的運算子列表:

  • .:成員訪問運算子
  • .*, ->*:成員指標訪問運算子
  • :::域運算子
  • sizeof:長度運算子
  • ?::條件運算子
  • #:預處理符號

我們將以矩陣為例示例過載運算子。

雙目算術運算子

matrix operator*(matrix x,matrix y)
{
	matrix tmp;
	tmp.clear();
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=y.
m;j++) for(int k=1;k<=x.m;k++) tmp.a[i][j]+=x.a[i][k]*y.a[k][j]; return tmp; }

關係運算符

bool operator==(const matrix x,const matrix y)
{
	if(x.n!=y.n)return 0;
	if(x.m!=y.m)return 0;
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=x.m;j++)
			if(x.a[i][j]!=y.a[i][j])
				return 0;
	return 1
; }

邏輯運算子

由於過載邏輯運算子過於毒瘤而被隱藏

//bool operator!(matrix x)
//{
//	for(int i=1;i<=x.n;i++)
//		for(int j=1;j<=x.m;j++)
//			if(!x.a[i][j])
//				return 1;
//	return 0;
//} 

單目運算子

matrix operator-(matrix x)
{
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=x.m;j++)
			x.a[i][j]=-x.a[i][j];
	return x;
} 

自增自減運算子

matrix& operator++(matrix &x)
{
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=x.m;j++)
			x.a[i][j]+=1;
	return x;
}//前置++ 
matrix operator++(matrix &x,int flag)
{
	matrix tmp=x;
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=x.m;j++)
			x.a[i][j]+=1;
	return tmp;
}//後置++ 

位運算子

matrix operator~(matrix x)
{
	matrix tmp;
	tmp.clear();
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=x.m;j++)
			tmp.a[i][j]=~x.a[i][j];
	return tmp;
} 

賦值運算子

matrix& operator*=(matrix &x,matrix y)
{
	return x=x*y;
}

過載函式

對於C++中預製的函式,有的函式由於固定了型別,比如pow在<math.h>中的返回值型別為double,傳的兩個引數型別也為double,那麼如果我們使用int進行操作,在某些編譯選項下(例如-lm),可能會CE;max和min函式在STL中的定義返回值型別為const<typename _Tp>&,傳的兩個引數型別也均為const<typename _Tp>&,這就意味著你不能把int和long long兩個型別的數同時傳到max或min裡,否則就會CE。

遇到這種情況,我們就需要過載函式,有的人可能稱這種為手寫函式,但實際上我們寫資料結構之類的函式是手寫函式沒問題,但max或min這種實際上是過載函式。

對於矩陣過載pow函式的例子:

matrix pow(matrix a,int k)
{
	matrix ans;
	ans.init();
	while(k)
	{
		if(k&1)ans*=a;
		a*=a;
		k>>=1;
	}
	return ans;
}

知識共享許可協議

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。