過載運算子和過載函式
阿新 • • 發佈:2018-11-11
過載運算子
可過載運算子/不可過載運算子
下面是可過載的運算子列表:
下面是不可過載的運算子列表:
- .:成員訪問運算子
.*
,->*
:成員指標訪問運算子- :::域運算子
- 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 國際許可協議進行許可。