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
過載加法
template
過載乘法
template
過載減法
};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
過載加法
template
過載乘法
template
過載減法
};template
template
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
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
過載加法
template
過載乘法
template
過載減法
};/*****兩個版本都不能少*****/
template
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
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 拷貝建構函式的問題,c 拷貝建構函式問題
你原來的程式就有些小問題,幫你也改了一下。在下面。include include using namespace std class location 建構函式1 location location int a int b double location distance location loc1...
C 類中為什麼只有建構函式和拷貝建構函式有引數列表
對類的成員函式宣告來說,參數列不是建構函式和拷貝建構函式的專利,一般的類的成員函式,也是可以選擇引數個數的。並且還要注意,就算是那些比較 特殊 的成員函式,如operator 也是有函式表的,而且拷貝建構函式由於其功能的原因,它的參數列還是固定格式的。我猜你是想問,為啥解構函式就沒有參數列呢,如果是...
c中建構函式與解構函式的問題,C 中建構函式與解構函式的問題
你的getname函式在 你的類定義中只有getscore和getid c 關於建構函式和解構函式呼叫次數的問題 沒問題啊。引數傳遞的時候第一次拷貝構造呼叫,在函式返回的時候賦值給c2 再次呼叫了拷貝構造。析構的話 c1 c2 c 三次 傳遞引數和返回引數各一次拷貝建構函式,所以是2次 有兩個物件c...