如果乙個類中什麼成員都沒有,簡稱為空類,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。
概念建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。 特性
建構函式是特殊的成員函式,需要注意的是,建構函式的雖然名稱叫構造,但是需要注意的是建構函式的主要任務並不是開空間建立物件,而是初始化物件。
其特徵如下:1. 函式名與類名相同。
2. 無返回值。
3. 物件例項化時編譯器自動呼叫對應的建構函式。
4. 建構函式可以過載。
class
date
// 2.帶參建構函式
date (
int year,
int month ,
int day )
private
:int _year ;
int _month ;
int _day ;};
void
testdate()
5. 如果類中沒有顯式定義建構函式,則c++編譯器會自動生成乙個無參的預設建構函式,一旦使用者顯式定義編譯器將不再生成
class
date
*/private
:int _year;
int _month;
int _day;};
void
test()
6. 無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。注意:無參建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式。
// 預設建構函式
class
date
date (
int year =
1900
,int month =1,
int day =1)
private
:int _year ;
int _month ;
int _day ;};
// 以下測試函式能通過編譯嗎?
void
test()
7. 成員變數的命名風格
class
date
private
:int year;};
// 所以一般建議如下寫**
class
date
private
:int _year;};
// 或者這樣。
class
date
private
:int m_year;};
// 其他方式也可以的,一般都是加個字首或者字尾標識區分
概念
析構函式:與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作。 特性
析構函式是特殊的成員函式。
其特徵如下:
1. 析構函式名是在類名前加上字元 ~。
2. 無引數無返回值。
3. 乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式。
4. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。
typedef
int datatype;
class
seqlist
~seqlist()
}private
:int
* _pdata ;
size_t _size;
size_t _capacity;
};
5. 編譯器生成的預設析構函式,對會自定型別成員呼叫它的析構函式。
s string ~
string()
private
:char
* _str;};
class
person
;int
main()
概念
建構函式:只有單個形參,該形參是對本類型別物件的引用(一般常用const修飾),在用已存在的類型別物件建立新物件時由編譯器自動呼叫。 特性
拷貝建構函式也是特殊的成員函式,其特徵如下:
1. 拷貝建構函式是建構函式的乙個過載形式。
2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
class
date
date
(const date& d)
private
:int _year;
int _month;
int _day;};
intmain()
3. 若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝。
class
date
private
:int _year;
int _month;
int _day;};
intmain()
4. 自己實現拷貝建構函式
// 這裡會發現下面的程式會崩潰掉?這裡就需要我們以後講的深拷貝去解決。
class
string
~string()
private
:char
* _str;};
intmain()
運算子過載
c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。
函式名字為:關鍵字operator後面接需要過載的運算子符號。
函式原型:返回值型別 operator操作符(引數列表)
注意:
// 全域性的operator==
class
date
//private:
int _year;
int _month;
int _day;};
// 這裡會發現運算子過載成全域性的就需要成員變數是共有的,那麼封裝性如何保證?
bool
operator==(
const date& d1,
const date& d2)
void test (
)class
date
// bool operator==(date* this, const date& d2)
// 這裡需要注意的是,左運算元是this指向的呼叫函式的物件
bool
operator==(
const date& d2)
private
:int _year;
int _month;
int _day;};
void test (
)
賦值運算子過載class
date
date (
const date& d)
date&
operator=(
const date& d)
}private
:int _year ;
int _month ;
int _day ;
};
賦值運算子主要有四點:
引數型別
返回值檢測是否自己給自己賦值
返回*this
乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。
class
date
private
:int _year;
int _month;
int _day;};
intmain()
const修飾類的成員函式 類與物件 中篇
1 類的6個預設成員函式 2 建構函式 1 概念 乙個特殊的成員函式,名字與類名相同,建立類型別物件的時候,由編譯器自己呼叫,在物件的生命週期中且呼叫一次,以保證每個資料成員都有乙個合適的初始值 2 建構函式的特性 class date test.cpp 無參建構函式 date date 帶參建構函...
程式設計師成長之旅 類和物件中篇
析構函式 拷貝建構函式 賦值運算子過載 const成員 取位址及const取位址運算子過載 如果乙個類中什麼都沒有,我們都知道它是空類,但是空類是不是什麼事情都不做,答案當然是否定的,它會生成6個預設函式。概念建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資...
類與物件 物件
一 什麼是物件?1.物件是由我們自己建立的類來建立出來的。2.物件就是類的例項 可以真正使用類的資料,可以呼叫類中元素的資料 3.乙個類可以建立出多個物件 二 如何建立物件?1.保證用來建立物件的類是存在 2.需要通過類中提供的構造方法建立物件 格式 new 構造方法 引數值 三 建立好的物件的有何...