建立乙個物件時,常常需要作某些初始化的工作,例如對資料成員賦初值。注意,類的資料成員是不能在宣告類時初始化的。
為了解決這個問題,c++編譯器提供了建構函式(constructor)來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來呼叫它,而是在建立物件時自動執行。
建構函式
1、建構函式定義及呼叫
(1)c++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式;
(2)建構函式在定義時可以有引數;
(3)沒有任何返回型別的宣告。
2、建構函式的呼叫
自動呼叫:一般情況下c++編譯器會自動呼叫建構函式
手動呼叫:在一些情況下則需要手工呼叫建構函式
析構函式
1、析構函式定義及呼叫
(1)c++中的類可以定義乙個特殊的成員函式清理物件,這個特殊的成員函式叫做析
語法:~classname()
(2)析構函式沒有引數也沒有任何返回型別的宣告
(3)析構函式在物件銷毀時自動被呼叫
2、析構函式呼叫機制
c++編譯器自動呼叫
#define _crt_secure_no_warnings
#include
using
namespace std;
class
test
void
print()
//析構函式
~test()
cout<<
"我是析構函式,被呼叫了"
<}protected
:private
:int a ;
char
*p;}
;//給物件搭建乙個舞台,研究物件的行為
void
objplay()
void
main()
c++編譯器構造析構方案 vs 物件顯示初始化方案
1、為什麼需要設定建構函式和析構函式?
物件導向的思想是從生活中來,手機、車出廠時,是一樣的。生活中存在的物件都是被初始化後才上市的;初始狀態是物件普遍存在的乙個狀態的。
2、是如何設定初始化的?普通方案:
為每個類都提供乙個public的initialize函式;
物件建立後立即呼叫initialize函式進行初始化
3、優缺點分析
initialize只是乙個普通的函式,必須顯示的呼叫
一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的,沒有初始化的物件,其內部成員變數的值是不定的
不能完全解決問題
//為什麼物件需要初始化 有什麼樣的初始化方案
#include
"iostream"
using
namespace std;
class
test21
void
setm
(int val)
int n;
intgetn()
const
void
setn
(int val)
public
:int
init
(int m,
int n)
protected
:private:}
;int
main()
;system
("pause");
return0;
}
1、無引數建構函式
2、有參建構函式
#include
using
namespace std;
//有引數建構函式的三種呼叫方法
class
test5
test5
(int a,
int b)
public:}
;int
main55()
3、拷貝構造函式呼叫時機
賦值建構函式的四種呼叫場景
第一和第二個呼叫場景
#include
"iostream"
using
namespace std;
class
first
//有參建構函式 預設建構函式
first
(int a)
first
(const first &obj2)
~first()
void
geta()
protected
:private
:int m_a;};
//建立乙個函式實現第一種呼叫方法
void
objplay01()
intmain()
第二種應用場景
class
second
//有參建構函式 預設建構函式
second
(int b)
second
(const second &obj2)
~second()
void
getb()
protected
:private
:int m_b;};
//建立乙個函式實現第二種呼叫方法
void
objplay02()
intmain()
第三種應用場景
#include
"iostream"
using
namespace std;
class
third
//複製建構函式
third
(const third & p)
~third()
intgetx()
intgety()
private
:int x, y;};
void
f(third p)
void
objplay03()
intmain()
第四種應用場景
第四個應用場景
#include
"iostream"
using
namespace std;
class
forth
//賦值建構函式
forth
(const forth & p)
~forth()
intgetx()
intgety()
private
:int x, y;};
void
f(forth p)
forth g()
//物件初始化操作 和 「=」等號操作 是兩個不同的概念
//匿名物件的去和留,關鍵看,返回時如何接
void
mainobjplay()
intmain()
4、預設建構函式
二個特殊的建構函式
1)預設無參建構函式
當類中沒有定義建構函式時,編譯器預設提供乙個無參建構函式,並且其函式體為空。
2)預設拷貝建構函式
當類中沒有定義拷貝建構函式時,編譯器預設提供乙個預設拷貝建構函式,簡單的進行成員變數的值複製。
當類中沒有定義任何乙個建構函式時,c++編譯器會提供預設無參建構函式和預設拷貝建構函式。
當類中定義了拷貝建構函式時,c++編譯器不會提供無引數建構函式
當類中定義了任意的非拷貝建構函式(即:當類中提供了有參建構函式或無參建構函式),c++編譯器不會提供預設無參建構函式
預設拷貝建構函式成員變數簡單賦值
總結:
只要你寫了建構函式,那麼你必須用。
構造析構階段性總結
建構函式是c++中用於初始化物件狀態的特殊函式
建構函式在物件建立時自動被呼叫
建構函式和普通成員函式都遵循過載規則
拷貝建構函式是物件正確初始化的重要保證
必要的時候,必須手工編寫拷貝建構函式
C 多個物件構造 析構 構造和析構的順序
include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...
類和物件 構造析構函式
a.類和物件 1.關鍵字class表明正宣告乙個類,類中資料成員 屬性 和資料功能 行為 經過封裝,使得使用者通過外部介面訪問。2.類的封裝隱藏了實現細節,同時也保證了資料的安全性。3.只要類的外部介面不變,內部實現細節再怎麼修改,使用類庫的程式也不用修改。4.物件是類型別的變數。5.內聯成員函式 ...
C 物件的構造和析構
一 建構函式 1 宣告 1 c 中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式 語法 classname 2 建構函式在定義時可以有引數 3 沒有任何返回型別的宣告。2 呼叫 自動呼叫 一般情況下c 編譯器會自動呼叫建構函式 手動呼叫 在一些情況下則需要手工呼叫建構函式...