1樓:文件類共創空間
一、 建構函式是幹什麼的
class counter
private:
// 資料成員
int m_value;
}該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式->由建構函式完成成員的初始化工作
eg: counter c1;
編譯系統為物件c1的每個資料成員(m_value)分配記憶體空間,並呼叫建構函式counter( )自動地初始化物件c1的m_value值設定為0
故:建構函式的作用:初始化物件的資料成員。
二、 建構函式的種類
class complex
// 一般建構函式(也稱過載建構函式)
// 一般建構函式可以有各種引數形式,一個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理)
// 例如:你還可以寫一個 complex( int num)的建構函式出來
// 建立物件時根據傳入的引數不同呼叫不同的建構函式
complex(double real, double imag)
// 複製建構函式(也稱為拷貝建構函式)
// 複製建構函式引數為類物件本身的引用,用於根據一個已存在的物件複製出一個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製一份到新建立的物件中
// 若沒有顯示的寫複製建構函式,則系統會預設建立一個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢 有關 「淺拷貝」 、「深拷貝」的文章論述
complex(const complex & c)
// 型別轉換建構函式,根據一個指定的型別的物件建立一個本類的物件
// 例如:下面將根據一個double型別的物件建立了一個complex物件
complex::complex(double r)
// 等號運算子過載
// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立
// 若沒有顯示的寫=運算子過載,則系統也會建立一個預設的=運算子過載,只做一些基本的拷貝工作
// 複製等號右邊的成員到左邊的物件中
this->m_real = rhs.m_real;
this->m_imag = rhs.m_imag;
// 把等號左邊的物件再次傳出
// 目的是為了支援連等 eg: a=b=c 系統首先執行 b=c
// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)
return *this;}};
下面使用上面定義的類物件來說明各個建構函式的用法:
void main()
三、思考與測驗
1. 仔細觀察複製建構函式
complex(const complex & c)
為什麼函式中可以直接訪問物件c的私有成員?
2. 挑戰題,瞭解引用與傳值的區別
complex test1(const complex& c)
complex test2(const complex c)
complex test3()
complex& test4()
void main()
四、附錄(淺拷貝與深拷貝)
上面提到,如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行「淺拷貝」,即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的地址與被拷貝物件的指標所指向的地址相同,delete該指標時則會導致兩次重複delete而出錯。下面是示例:
【淺拷貝與深拷貝】
#include
#include
class person
}// 系統建立的預設複製建構函式,只做位模式拷貝
person(person & p)
~person( )
private :
char * m_pname;
};void main( )
// 下面自己設計複製建構函式,實現「深拷貝」,即不讓指標指向同一地址,而是重新申請一塊記憶體給新的物件的指標資料成員
person(person & chs);
// 則新建立的物件的m_pname與原物件chs的m_pname不再指向同一地址了}
2樓:匿名使用者
建構函式的訪問型別public,protected,private,都可以,主要還是public,因為在繼承和派生的時候,基類的pubic經過派生後仍然是public型別,可以被派生類的其它函式直接訪問,而protected,private經過繼承後仍是protected,private。派生類內的函式就不能訪問private型別的了,而protected在該派生類之外的類就不能直接訪問了,所以不方便。因此採用public較好
3樓:
建構函式一般都定義成public。否則不能建立物件的。
4樓:外星戰牛
一般都是public型別。private型別沒有什麼用,protected型別也有,不過很少
c++中類中的結構體資料成員怎麼用建構函式初始化
5樓:匿名使用者
結構體本身就是一個class只不過所有成員的預設訪問級別為public。它定義建構函式和普通class一樣的
c 建構函式過載,C 建構函式過載的問題?
應該是object 1 10 呼叫 sum int object 2 10.5 呼叫 sum double 因為c 在呼叫函式是會自動識別資料型別,如果你把10改為10.0,也是呼叫sum double 了 主要看你的引數是什麼型別的,如果是整型就呼叫sum int 浮點型的呼叫sum double...
c中建構函式與解構函式的問題,C 中建構函式與解構函式的問題
你的getname函式在 你的類定義中只有getscore和getid c 關於建構函式和解構函式呼叫次數的問題 沒問題啊。引數傳遞的時候第一次拷貝構造呼叫,在函式返回的時候賦值給c2 再次呼叫了拷貝構造。析構的話 c1 c2 c 三次 傳遞引數和返回引數各一次拷貝建構函式,所以是2次 有兩個物件c...
c無參的建構函式問題,C 中無參建構函式的使用問題
vs 2005要求必須要有建構函式,這是一定的不過如果有帶參建構函式,就可以不要無引數的建構函式。至於當類中有帶引數的建構函式時,vs 2005要求有一個無參的建構函式。這只是一種建議。就像你說的,他是為了防範出錯,屬於比較保守的安全程式設計,類似於斷言程式設計一類的規定 就好比說,有一個電器他規定...