求C 拷貝建構函式

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

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.如果拋異常標識構造失敗,那麼,所有...