1樓:q嘿仔
#include
using namespace std;
template
class cmatrix
nrow = row;
ncol = col;
} //預設建構函式
void setcmatrix(int row, int col, const t& data)
//鍵盤輸入
void show()
} //輸出
void inputfromfile(){} //從檔案中輸入
~cmatrix(){} //解構函式
cmatrix(const cmatrix&m);
int getnrow() const //得到矩陣行值
int getncol() const //得到矩陣列值
template
friend cmatrixoperator +(cmatrix&mat1,cmatrix&mat2){} //過載加法
template
friend cmatrixoperator *(cmatrix&mat1,cmatrix&mat2){} //過載乘法
template
friend cmatrixoperator -(cmatrix&mat1,cmatrix&mat2){} //過載減法
};template
cmatrix::cmatrix(const cmatrix& m)
for (int i = 0; i < m.nrow; ++i)
for (int j = 0; j < m.ncol; ++j)
mat[i][j] = m.mat[i][j];
nrow = m.nrow;
ncol = m.ncol;
}int main()
為了得以體現輸出結果,我稍微補了一些函式的實現(如,建構函式,set,show)。
輸出結果為:
3show matrix a:
5 2 0
0 0 3
show matrix b:
0 0 0
0 0 0
show matrix c:
5 2 0
0 0 3
show matrix a:
9 2 0
4 0 3
show matrix c:
5 2 0
0 0 3
press any key to continue . . .
你的程式大致來說沒有什麼問題,無非就是少用了const之類的。所以我稍微加了一兩個意思一下。
你不是主要問拷貝建構函式嗎?最好給引數加上const,使用引用而不實用傳值,是由於引用比傳值高效,但是引用有弊病,那就是可能修改傳進來的值。在這裡我們要確保傳進來的矩陣沒有被修改(不能被修改),所以加上const來起限制作用(除非有特殊的需求,如標準庫中auto_ptr,否則拷貝建構函式的寫法就是我寫的那種)。
給你再做一個更為複雜但是普遍用於stl的做法,即
vector a;
vectord = a;
兩個型別不同,但是賦值從是允許的!
**實現如下:
#include
using namespace std;
template
class cmatrix
nrow = row;
ncol = col;
} //預設建構函式
void setcmatrix(int row, int col, const t& data)
//鍵盤輸入
void show()
} //輸出
void inputfromfile(){} //從檔案中輸入
~cmatrix(){} //解構函式
/***** copy constructor ******/
template
cmatrix(const cmatrix&m);
/*****************************/
int getnrow() const //得到矩陣行值
int getncol() const //得到矩陣列值
const t& getdata(int row, int col) const
t& getdata(int row, int col)
template
friend cmatrixoperator + (const cmatrix&mat1, const cmatrix&mat2); //過載加法
template
friend cmatrixoperator * (const cmatrix&mat1, const cmatrix&mat2); //過載乘法
template
friend cmatrixoperator - (const cmatrix&mat1, const cmatrix&mat2); //過載減法
};template
template
cmatrix::cmatrix(const cmatrix&m)
for (int i = 0; i < m.getnrow(); ++i)
for (int j = 0; j < m.getncol(); ++j)
mat[i][j] = static_cast(m.getdata(i, j));
nrow = m.getnrow();
ncol = m.getncol();
}int main()
輸出結果為:
3show matrix a:
5 2 0
0 0 3
show matrix b:
0 0 0
0 0 0
show matrix c:
5 2 0
0 0 3
show matrix a:
9 2 0
4 0 3
show matrix c:
5 2 0
0 0 3
show matrix d:
5 2 0
0 0 3
show matrix d:
2.3 2 0
5.2 0 3
press any key to continue . . .
/******注意*******/
template
cmatrix::cmatrix(const cmatrix& m)
for (int i = 0; i < m.nrow; ++i)
for (int j = 0; j < m.ncol; ++j)
mat[i][j] = m.mat[i][j];
nrow = m.nrow;
ncol = m.ncol;
}template
template
cmatrix::cmatrix(const cmatrix&m)
for (int i = 0; i < m.getnrow(); ++i)
for (int j = 0; j < m.getncol(); ++j)
mat[i][j] = static_cast(m.getdata(i, j));
nrow = m.getnrow();
ncol = m.getncol();
}上面兩個兩個建構函式的實現略有差異:第二個版本中使用了mat = new t*[m.getnrow()];
而第一個版本中則使用了簡單的mat = new t*[m.nrow];
這是由於:在第一個函式中引數const cmatrix& m,其中m的型別是cmatrix,在同一個類中成員可以使用私有成員(nrow)
而第二個函式中引數是const cmatrix& m,其中m的型別是cmatrix而非cmatrix,他們輸入不同的型別,所以子matrix不能訪問型別為matrixm的私有成員。
最後,閒著沒事給你加一個賦值運算子的過載和解構函式:(因為有一個規則:當你自己決定手寫拷貝建構函式是,你也應該過載賦值運算子和手寫解構函式)
完整的程式:
#include
using namespace std;
template
class cmatrix
//預設建構函式
void setcmatrix(int row, int col, const t& data)
//鍵盤輸入
void show()
} //輸出
void inputfromfile(){} //從檔案中輸入
~cmatrix()
//解構函式
cmatrix(const cmatrix&m) ;
/***** copy constructor 2 ******/
template
cmatrix(const cmatrix&m) ;
/*****************************/
template
cmatrix& operator = (const cmatrix& m);
int getnrow() const //得到矩陣行值
int getncol() const //得到矩陣列值
const t& getdata(int row, int col) const
t& getdata(int row, int col)
template
friend cmatrixoperator + (const cmatrix&mat1, const cmatrix&mat2); //過載加法
template
friend cmatrixoperator * (const cmatrix&mat1, const cmatrix&mat2); //過載乘法
template
friend cmatrixoperator - (const cmatrix&mat1, const cmatrix&mat2); //過載減法
};/*****兩個版本都不能少*****/
template
cmatrix::cmatrix(const cmatrix&m)
for (int i = 0; i < m.getnrow(); ++i)
for (int j = 0; j < m.getncol(); ++j)
mat[i][j] = m.getdata(i, j);
nrow = m.getnrow();
ncol = m.getncol();
}template
template
cmatrix::cmatrix(const cmatrix&m)
for (int i = 0; i < m.getnrow(); ++i)
for (int j = 0; j < m.getncol(); ++j)
mat[i][j] = m.getdata(i, j);
nrow = m.getnrow();
ncol = m.getncol();
}/**************************/
template
template
cmatrix& cmatrix::operator = (const cmatrix& m)
for (int i = 0; i < m.getnrow(); ++i)
for (int j = 0; j < m.getncol(); ++j)
mat[i][j] = m.getdata(i, j);
nrow = m.getnrow();
ncol = m.getncol();
}return *this;
}int main()
控制複製的內容也就差不多全了,你的cmatrix類可以安全的使用了!
說的有點多了,因為睡不著!呵呵呵,希望對你有用!
對了,我程式的編譯環境:visual studio 2010
C 拷貝建構函式的問題,就是用類物件初始化另類物件時,會自動呼叫建構函式
亥凝思 你用的vc 編譯的吧?vc的特點就是對於指標,如果沒顯示的初始化為null,會預設指向位址為cccccccc 的記憶體,你換成別的編譯器實施就知道。c 中,如果建構函式沒有預設值,物件也沒有引數賦值過去,那麼定義類的物件,呼叫建構函式時會出錯嗎 影者東昇 不會的。c 類的建構函式詳解 一 建...
C 中的建構函式問題,c 建構函式的問題
建構函式一般用來對類中的資料成員進行初始化工作,但並不是要對全部資料初始化,你只需要選擇自己需要的資料進行賦值即可。其實這一點從預設的建構函式也能看出來 當你沒有顯示的寫乙個建構函式的時候,編譯器會為你提供乙個預設的建構函式,它沒有引數,只有乙個空語句,也就是說它沒有對任何資料成員進行初始化。由於構...
c當建構函式失敗時建構函式內部怎麼處理
w別y雲j間 1 建構函式想通知外部自己構造失敗,只有拋異常這一個途徑 沒有返回值 2 如果不拋異常,那麼建構函式執行完畢,從語言層面上編譯器認為該物件是正確構造了的,其實構造沒有按預想的進行,所以需要用狀態變數 建構函式引用引數就可以讓外界可以知道構造失敗了。3.如果拋異常標識構造失敗,那麼,所有...