二 . 建構函式的分類及呼叫
三 . 拷貝構造函式呼叫時機
四 . 構造函式呼叫規則
五 . 深拷貝與淺拷貝
六 . 類物件作為類成員的呼叫規則
七 . 靜態成員
c++利用建構函式和析構函式進行物件的初始化和清理,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。
物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供
編譯器提供的建構函式和析構函式是空實現。
建構函式語法:類名(){}
建構函式,沒有返回值也不寫void
函式名稱與類名相同
建構函式可以有引數,因此可以發生過載程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次
析構函式語法:~類名(){}
析構函式,沒有返回值也不寫void
函式名稱與類名相同,在名稱前加上符號 ~
析構函式不可以有引數,因此不可以發生過載程式在物件銷毀前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次
#include
using
namespace std;
class
person
//析構函式
~person()
};void
test01()
intmain()
#include
using
namespace std;
class
person
//初始化列表方式初始化
person
(int a,
int b,
int c)
:m_a
(a),
m_b(b)
,m_c
(c)void
printperson()
private
:int m_a;
int m_b;
int m_c;};
intmain()
兩種分類方式:
按引數分為: 有參構造和無參構造
按型別分為: 普通構造和拷貝構造
三種呼叫方式:
括號法
顯示法
隱式轉換法
#include
using
namespace std;
//1、建構函式分類
// 按照引數分類分為 有參和無參構造 無參又稱為預設建構函式
// 按照型別分類分為 普通構造和拷貝構造
class
person
//有參建構函式
person
(int a)
//拷貝建構函式
person
(const person& p)
//析構函式
~person()
};//2、建構函式的呼叫
//呼叫無參建構函式
void
test01()
//呼叫有參的建構函式
void
test02()
intmain()
c++中拷貝構造函式呼叫時機通常有三種情況
#include
using
namespace std;
class
person
person
(int age)
person
(const person& p)
//析構函式在釋放記憶體之前呼叫
~person()
public
:int mage;};
//1. 使用乙個已經建立完畢的物件來初始化乙個新物件
void
test01()
//2. 值傳遞的方式給函式引數傳值
//相當於person p1 = p; (隱式轉換法)
void
dowork
(person p1)
void
test02()
//3. 以值方式返回區域性物件
person dowork2()
void
test03()
intmain()
預設情況下,c++編譯器至少給乙個類新增3個函式
1.預設建構函式(無參,函式體為空)
2.預設析構函式(無參,函式體為空)
3.預設拷貝建構函式,對屬性進行值拷貝
構造函式呼叫規則如下:
#include
using
namespace std;
class
person
//有參建構函式
person
(int a)
//拷貝建構函式
person
(const person& p)
//析構函式
~person()
public
:int age;};
void
test01()
void
test02()
intmain()
淺拷貝:簡單的賦值拷貝操作
深拷貝:在堆區重新申請空間,進行拷貝操作
#include
using
namespace std;
class
person
//有參建構函式
person
(int age ,
int height)
//拷貝建構函式
person
(const person& p)
//析構函式
~person()
}public
:int m_age;
int* m_height;};
void
test01()
intmain()
當類中成員是其他類物件時,我們稱該成員為物件成員
構造的順序是 :先呼叫物件成員的構造,再呼叫本類構造
析構順序與構造順序相反
#include
using
namespace std;
class
phone
~phone()
string m_phonename;};
class
person
~person()
void
playgame()
string m_name;
phone m_phone;};
void
test01()
intmain()
靜態成員就是在成員變數和成員函式前加上關鍵字static
,稱為靜態成員
靜態成員分為:
靜態成員函式
#include
using
namespace std;
class
person
;//類內定義,類外初始化靜態變數
int person::m_a =10;
int person::m_b =10;
void
test01()
intmain()
#include
using
namespace std;
class
person
static
int m_a;
//靜態成員變數
int m_b;
//private
://靜態成員函式也是有訪問許可權的
static
void
func2()
};int person::m_a =10;
void
test01()
intmain()
C 建構函式 析構函式 拷貝建構函式
建構函式 析構函式 拷貝建構函式 如果類成員變數有初始值,用這些初始值初始化成員變數 如果類成員變數沒有初始值,則預設初始化該成員變數 class student int main 使用注意事項 語法 這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...
C 建構函式 拷貝構造 析構函式
建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...
建構函式 拷貝建構函式 析構函式
1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...