求C 拷貝建構函式

時間 2021-08-11 17:47:26

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...