[求助]?關于拷貝構造函數,對象傳遞!!
#include?
<
iostream.h
>
class
?Matrix
{
private
:
????
int
?rows,columns;
public
:
????????
int
?
**
pMatrix;
???Matrix(?
int
?rows,
int
?columns);
???Matrix(Matrix
&
?);
???
~
Matrix();
int
?GetRows();
int
?GetColumns();
void
?SetValue();
void
?Mul(Matrix?a,Matrix?b);
void
?Mul(Matrix?
*
pa,Matrix?
*
pb);
void
?Mul(Matrix?
&
a,Matrix?
&
b);
}
;

int
?Matrix::GetRows()
{
return
?rows;}
;
int
?Matrix::GetColumns()
{
return
?columns;}
;
//
構造函數
Matrix::Matrix(
int
?x,
int
?y)
{
?????rows
=
x;
?????????columns
=
y;
????????pMatrix
=
new
?
int
*
?[x];
?????
for
(
int
?i
=
0
;?i
<
x;?i
++
)
?????pMatrix[i]
=
new
?
int
?[y];
}
//
析構函數
Matrix::
~
Matrix()
{
????????
for
(
int
?i
=
0
;i
<
rows;i
++
)
??????????delete[]?pMatrix[i];
????delete[]?pMatrix;
}
//
賦值函數
void
?Matrix::SetValue()
{
????
int
?i,j,value;
????
for
(?i
=
0
;?i
<
rows;?i
++
)
??????
{
???????????
for
(?j
=
0
;?j
<
columns;?j
++
)
?????????
{
????????????????cout
<<
"
第
"
<<
i
<<
"
行
"
;
????????cout
<<
"
第
"
<<
j
<<
"
列:
"
;
????????cin
>>
value;
????????cout
<<
endl;
????????pMatrix[i][j]
=
value;
?????????}
???????}
}
//
拷貝構造函數
Matrix::Matrix(Matrix
&
?M)
{??
?????
for
(
int
?i
=
0
;?i
<
M.rows;?i
++
)
?????????????????
for
(
int
?j
=
0
;?j
<
M.columns;?j
++
)
???????????????????pMatrix[i][j]
=
M.pMatrix[i][j];?????
/**/
///
//這里對不對?有什么更好的方式?
}
void
?Matrix::Mul(Matrix?a,Matrix?b)
{
??Matrix?c(a.GetRows(),b.GetColumns());
????
for
(
int
?i
=
0
;i
<
a.GetRows();i
++
)
{
????????????????
for
(
int
?y
=
0
;y
<
b.GetColumns();y
++
)
{
??????????
if
?(a.GetColumns()
==
b.GetRows())
????????????
for
(
int
?j
=
0
,x
=
0
;j
<
a.GetColumns(),x
<
b.GetRows?();j
++
,x
++
)
??????????????????c.pMatrix[i][y]?
+=
a.pMatrix[i][j]
*
b.pMatrix[x][y];????
/**/
///
//這里對不對?有什么更好的方式?
???????????
else
?
break
;
????????????????????????
????????????????}
????????}
???
}
//
主函數
void
?main()
{
????????Matrix?Ma(
3
,
2
),Mb(
2
,
2
);
????????Ma.SetValue();
????????Mb.SetValue();
????
for
(
int
?i;i
<
Ma.GetRows();i
++
)
????????????????
for
(
int
?j;j
<
Ma.GetColumns();j
++
)
????????????????????????cout
<<
Ma.pMatrix[i][j];??
//
為什么編譯運行后不能輸出呢??
????????Matrix?Mc(
3
,
2
);???
/**/
///
覺得這樣不妥,還有什么跟好的方法么
????????Mc.Mul(Ma,Mb);????
/**/
///
這樣也不對,怎么讓兩個Matrix對象相乘呢,有什么更好的方式么?
}
感謝大家熱心指教。
一下是整理后的。

/**//////////////////////////////////////////////////
/////////////////////////////////////////////////
///////////////////Matrix.Class////////////////////////
#include?<iostream.h>
//using?namespace?std;???????//為什么不能在VC下正常使用
class?Matrix

{
private:
????int?**pMatrix;
????int?rows,columns;
public:
static?int?ObjectAliveNo;
????Matrix(int?rows=0,int?columns=0);
????Matrix(const?Matrix?&M);
????~Matrix();
Matrix&?operator=(const?Matrix&?M);
int?GetRows()?const;
int?GetColumns()?const;
int?GetObjNo()?const;
void?SetValue();
void?Mul(const?Matrix?a,const?Matrix?b);
void?Mul(const?Matrix?*pa,const?Matrix?*pb);
void?MUl(const?Matrix?&a,const?Matrix?&b);
friend?Matrix?operator~(Matrix&?a);?????????????????????????????????//重載"~"操作符實現矩陣轉置
friend?Matrix?operator*(const?Matrix&?a,const?Matrix&?b);??????????//重載"~"操作符實現矩陣相乘
//friend?ostream&?operator<<(const?ostream&?os,const?Matrix&?M);???//!??!
friend?ostream&?operator<<(ostream&?os,const?Matrix&?M);
};
//構造函數
Matrix::Matrix(int?x,int?y)

{
????ObjectAliveNo++;
????rows=x;
????columns=y;
??????pMatrix=new?int?*[rows];????????//創建指針數組
??????for(int?i=0;?i<rows;?i++)
{
???????pMatrix[i]=new?int?[columns];?//真正實現二維數組
???????for(int?j=0;?j<columns;?j++)
?????????pMatrix[i][j]=0;???????????//對二維數組初始化
?????}
}
//拷貝構造函數函數
Matrix::Matrix(const?Matrix&?M)

{
????rows=M.rows;
????columns=M.columns;
????//賦值前現分配空間!
????pMatrix=new?int?*[rows];
?????for(int?m=0;?m<rows;?m++)
???????pMatrix[m]=new?int?[columns];
???????
??for(int?i=0;i<rows;i++)
????for(int?j=0;j<columns;j++)
??????pMatrix[i][j]=M.pMatrix[i][j];
}
//析構函數
Matrix::~Matrix()

{
????ObjectAliveNo--;
????for(int?i=0;i<rows;i++)
????delete[]?pMatrix[i];????????//注意delete的順序
????delete[]?pMatrix;
}
//
int?Matrix::GetRows()?const?
{return?rows;}????????????//行
int?Matrix::GetColumns()?const?
{return?columns;}??????//列
int?Matrix::GetObjNo()?const?
{return?ObjectAliveNo;}??//對象數

//為矩陣賦值
void?Matrix::SetValue()

{
??cout<<"請對矩陣的每一項賦值:"<<endl;
????int?i,j,value;
????for(i=0;i<rows;i++)
??????for(j=0;j<columns;j++)
{
????????cout<<"第?"<<i+1<<"行";
????????cout<<"第"<<j+1<<"列:";
????????cin>>value;
????????pMatrix[i][j]=value;
??????}
}
//重載"="操作符實現矩陣之間賦值
Matrix&?Matrix::operator=(const?Matrix&?M)

{
?????if(this?!=?&M)
{
????for?(int?ii?=?0?;ii?<?rows;ii++?)
??????if(pMatrix[ii])
??????delete[]?pMatrix[ii];
???if(pMatrix)
???delete[]?pMatrix;
???rows?=?M.rows;
???columns?=?M.columns;
??//分配存儲空間
???pMatrix?=?new?int*?[rows];
???for?(int?k=0?;k<rows?;k++?)
???pMatrix[k]?=?new?int[columns];
???for?(?int?i=0;?i<rows;?i++?)
?????for?(?int?j?=?0?;?j?<?columns;?j?++?)
??????pMatrix[i][j]?=?M.pMatrix[i][j];
?}
return?*this;
}
//調用函數實現矩陣相乘操作
void?Matrix::Mul(const?Matrix?a,const?Matrix?b)

{
????Matrix?c(a.GetRows(),b.GetColumns());
????if(a.GetColumns()==b.GetRows())
{
???????int?temp=0;
???????for(int?i=0;i<a.GetRows();i++)
???????????for(int?j=0;j<b.GetColumns();j++)
{
??????????????for(int?k=0;k<a.GetColumns();k++)
??????????????temp=temp+a.pMatrix[i][k]*b.pMatrix[k][j];
??????????????c.pMatrix[i][j]=temp;
??????????????temp=0;
???????????}
????}
//輸出相乘結果
?????for(int?i=0;i<c.GetRows();i++)
{
????cout<<'\n';
????????for(int?y=0;y<c.GetColumns();y++)
??????????????cout<<c.pMatrix[i][y]<<'?';
????????}
}
//重載操作符"*"實現矩陣相乘操作
Matrix?operator*(const?Matrix&?a,const?Matrix&?b)

{
if?(a.columns?==?b.rows)
{
??Matrix?c(a.rows,b.columns);
???for?(?int?i?=?0?;i?<?a.rows;i?++?)
{
????for?(?int?j?=?0?;j?<?b.columns;j?++?)
{
???????for?(?int?columnIndex=?0?;columnIndex?<?a.columns;columnIndex++?)
?????????c.pMatrix[i][j]?+=?a.pMatrix[i][columnIndex]?*?b.pMatrix[columnIndex][j];
???????}
????}
????return?c;
??}
else
return?Matrix();
}
//重載"~"操作符實現矩陣轉置
Matrix?operator~(Matrix&?a)

{
????Matrix?b(a.columns,a.rows);
????for(int?i=0;i<a.rows;i++)
?????for(int?j=0;j<a.columns;j++)
??????b.pMatrix[j][i]=a.pMatrix[i][j];
??????
??????return?b;
}

//對"cout"進行重定義
ostream&?operator<<(ostream&?os,const?Matrix&?M)
{
??for?(int?i?=?0;i?<?M.rows;i++?)
{
?????for?(int?j?=?0;j?<?M.columns;j++?)
???????os?<<?M.pMatrix[i][j]?<<?"?";
???????os?<<?endl;
??}
?return?(os?<<?endl);
}
//靜態成員賦初值!
int?Matrix::ObjectAliveNo=0;
//主函數
int?main()

{
????Matrix?Ma(6,3),Mb(3,5);
????Ma.SetValue();
????Mb.SetValue();
cout<<'\n'<<"現在有"<<Ma.GetObjNo()<<"個矩陣"<<endl;?????//前后對比檢查各種函數對ObjectAliveNo的影響
cout<<Ma<<endl;
Matrix?Mc;
Mc=Ma*Mb;
cout<<Mc;
cout<<'\n'<<"現在有"<<Ma.GetObjNo()<<"個矩陣"<<endl;?????//見上一條注釋?!!出現錯誤:沒有正常計數
cout<<"Ma的轉置:"<<endl;
Matrix?Me;
Me=~Ma;
cout<<Me<<endl;
Matrix?Md;
Md.Mul(Ma,Mb);
cout<<'\n'<<"現在有"<<Ma.GetObjNo()<<"個矩陣"<<endl;????//有沒有正常計數?

return?0;
}

