初始化物件,有且僅在定義乙個物件時自動執行一次的函式
類的資料成員是不能在宣告類的時候初始化的,因為類並不是乙個實體,而是一種抽象的資料型別,並不佔據儲存空間
1、函式名與類名相同
2、無返回值
3、例項化物件時系統會自動呼叫對應的建構函式
4、可過載
5、建構函式可以在類內定義,可以在類外定義
6、如果類定義中沒有給出建構函式,則c++編譯器會自動生成乙個預設的建構函式;如果我們定義了乙個建構函式,系統就不會生成預設的建構函式。
7、無參的建構函式和預設的建構函式都認為是預設的建構函式,所以預設的建構函式只能有乙個。
8、不用傳參的建構函式是預設建構函式
1、無參建構函式和有參建構函式
當使用者希望對不同的物件賦予不同的初始值時,就需要用到帶參的建構函式,實現不同的初始化。因為使用者不能呼叫建構函式,所以其對應的實參需要在定義物件的時候給定。
2、帶預設的建構函式
建構函式中引數的值既可以通過實參傳遞,也可以被指定為某些預設值。如果使用者不指定實參值,編譯系統就使用形參的預設值。
1初始化列表,位於構造函式引數列表之後,在函式體「{}」之前。該列表內的初始化工作發生在函式體內的任何**被執行之前。
初始化列表優點:
1.如果類存在繼承關係,派生類可以直接在其初始化列表裡呼叫基類的特定建構函式以向它傳遞引數,因為不能在初始化物件時訪問基類的資料成員。
2.類的非靜態const資料成員和引用成員只能在初始化列表裡初始化,因為它們只存在初始化語義,而不存在賦值語義。
3.類的資料成員的初始化可以採用初始化列表或函式體內賦值兩種方式,但是使用初始化列表的方式效率更高。
class date
private:
int _year;
int _month;
int _day;
};class date
date(int year, int month, int day); //在類內宣告乙個建構函式,在類外定義
//在類內定義建構函式
date(int year, int month, int day) //建構函式過載 (帶參建構函式)
//帶預設的建構函式
date(int year = 2018, int month = 7, int day = 30)
//半預設的建構函式(不常用)
date(int year, int month = 7)
void printfdate()
private:
int _year;
int _month;
int _day;
};//在類外定義建構函式
date::date(int year = 2018, int month = 7, int day = 30) //建構函式過載
int main()
1、建立物件時使用同類物件進行處初始化所用的建構函式
2、只有乙個引數,這個引數只能是本類的乙個物件,且採用物件的常引用形式
1、是建構函式的過載
2、引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
3、若未顯示定義,系統預設生成預設拷貝建構函式,預設的拷貝建構函式會按照成員的宣告順序依次拷貝類成員進行初始 化。
class date
//拷貝建構函式
date(const date& d)
void printfdate()
private:
int _year;
int _month;
int _day;
};int main()
當乙個物件的生命週期結束時,c++編譯器會自動呼叫乙個成員函式,這個成員函式即為析構函式,作用與建構函式相反。
1、類名前加」~「字元
2、無參,無返回值,不能過載
3、乙個類有且只有乙個析構函式,物件生命週期結束時,若未定義,c++編譯系統會自動生成預設的析構函式。
4、呼叫建構函式和析構函式的順序 :因為函式壓棧的關係,所以先構造的後析構,後構造的先析構。如果有全域性物件或者靜態區域性物件,則它們在main函式結束或者呼叫exit函式時才被析構。
5、析構函式的作用並不是刪除物件,而是在撤銷物件時做一些清理工作,比如關閉開啟的檔案,釋放開闢的動態記憶體等。
class array
//這裡的析構函式需要完成清理工作
~array()
}private:
int* _ptr;
};
如果已經定義了兩個或多個物件,則這些同類的物件之間可以相互賦值,即乙個物件的值可以賦給另乙個同類的物件。這裡所指的物件的值是指物件中所有資料成員的值。物件之間的賦值是通過賦值運算子「=」過載實現的,即:將乙個物件的值一一複製給另一物件的對應成員。
class date
//拷貝建構函式
date(const date& d)
//賦值運算子過載
date& operator = (const date& d)
return *this;
}void printfdate()
private:
int _year;
int _month;
int _day;
};
class date
const date * operator&() const
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變。
class date
{public :
void display ()
{cout<
C 類的6個預設成員函式
1.概念 名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有乙個合適的初 始值,並且在物件的生命週期內只呼叫一次。2.特性 雖然名字叫構造,但其主任務並不是開闢空間建立物件,而是初始化物件。函式名與類名相同,無返回值,物件例項化時編譯器自動呼叫對應的建構函式,建構函式可以過載,通...
C 類的6個預設成員函式
如果乙個類中什麼成員都沒有,簡稱為空類。空類中什麼都沒有嗎?並不是的,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。1.建構函式 1.1 概念 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有乙個合適的初始值,並且在物件的生命週期...
C 中類的6個預設成員函式
1.建構函式 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內隻且值呼叫一次,以保證每個資料成員都有乙個合適的初始值。建構函式特性 1 函式名與類名相同。2 沒有返回值。3 有初始化列表 可以不用 4 新物件被建立,由編譯器自動呼叫,且在物件的生命...