C++的六个默认函数
C++中,類有六個默認函數(shù),分別是:
目錄
1、構造函數(shù)
2.析構函數(shù)??
3.拷貝構造函數(shù)
4、賦值運算符重載函數(shù)
5、取地址操作符重載函數(shù)
6、const修飾的取地址符重載函數(shù)
1、構造函數(shù)
定義:在定義一個對象的同時,希望能給它的數(shù)據(jù)成員賦值——對象的初始化的成員函數(shù),叫做構造函數(shù)。
在C++中,由于類的封裝性,它不允許在類的非成員函數(shù)中直接訪問類對象的私有和保護數(shù)據(jù)成員,不能在建立類的時候初始化。所以對于類對象數(shù)據(jù)成員的初始化工作就落到了類對象的成員函數(shù)身上,因為它們可以訪問類對象的私有和保護成員。
#include<iostream> using nmespace std;class Clock { public:Clock()//構造函數(shù){cout << "Clock()" << endl;hour = 0;minute = 0;second = 0;}void Show(){cout << hour << ":" << minute << ":" << second << endl;} private:int hour;int minute;int second; };int main() {Clock MyClock(8,30,30);MyClock.Show();return 0; }特點:
(1)函數(shù)名與類名是相同的
(2)在建立對象時,系統(tǒng)自動調(diào)用的函數(shù)。
(3)這個函數(shù)體是空的,默認構造函數(shù)并不具備任何功能。
(4)可以重載。
(5)不能夠手動調(diào)用。
(6)沒有返回值
(7)可以在類中定義,也可以在類外定義。
(8)如果用戶為類定義了一個構造函數(shù),系統(tǒng)就不會生成任何默認的構造函數(shù)。
(9)作為類的成員函數(shù),構造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員,可以是內(nèi)聯(lián)函數(shù),可以不帶任何參數(shù),可以帶有參數(shù)表以及默認參數(shù)值。
PS: 構造函數(shù)與其他成員的區(qū)別:
(1)構造函數(shù)必須和類名相同,而一般成員函數(shù)不能和類名相同。
(2)構造函數(shù)主要功能在于類的對象創(chuàng)建時定義初始化的狀態(tài),沒有返回值,不能用void修飾,其他函數(shù)可以有返回值,也可以沒有,但是必須用void予以說明。
(3)構造函數(shù)不能被直接調(diào)用,一般成員函數(shù)在程序執(zhí)行時被調(diào)用。
2.析構函數(shù)??
(~構造函數(shù)名)
~Clock() {cout << "~Clock" << endl; }定義:在特定對象使用結束后,需要進行一些清理工作由特殊成員函數(shù)完成,叫做析構函數(shù)。
特點:
(1)沒有任何參數(shù),不能被重載,但可以是虛函數(shù),一個類只能有一個析構函數(shù)。
(2)沒有返回值。
(3)析構函數(shù)一般由用戶自己定義,在對象消失時由系統(tǒng)自動調(diào)用。
(4)默認析構函數(shù)是空函數(shù),不做任何事。
3.拷貝構造函數(shù)
類名(類型 & 變量名)
Clock(Clock & p)//拷貝構造函數(shù) {cout << "copy Clock(Clock &p)" << endl;hour = p.hour;minute = p.minute;second = p.second; }定義:用于在建立新對象時將已存在對象的數(shù)據(jù)成員值拷貝給新對象,即用一個已存在的對象去初始化一個新建立的對象。
形式:
類名(類名 & 對象名)
{ ... }?? //函數(shù)體
特點:
(1)拷貝構造函數(shù)其實是構造函數(shù)的重載
(2)拷貝構造函數(shù)的參數(shù)必須使用引用傳參,不能使用傳值傳參
(3)如果用戶沒有定義拷貝構造函數(shù),系統(tǒng)會默認缺省的拷貝構造函數(shù),缺省的拷貝構造函數(shù)會依次拷貝類成員進行初始化
PS:
(1)默認的拷貝構造函數(shù)是淺拷貝。如果類成員變量有指針,考慮實現(xiàn)深拷貝。
(2)形參一定要加引用。
(3)拷貝構造函數(shù)與構造函數(shù)有且只會調(diào)用一個。
(4)用一個常量初始化新建立的對象時,調(diào)用構造函數(shù),不調(diào)用拷貝構造函數(shù)。
(5)當對象作為函數(shù)的返回值時需要調(diào)用拷貝構造函數(shù),此時C++將從堆中動態(tài)建立一個臨時對象,將函數(shù)的返回的對象拷貝給該臨時對象, 并把該臨時對象的地址存儲在寄存器里,從而由該臨時對象完成函數(shù)返回值的傳遞。
(6)默認的拷貝構造函數(shù)是淺拷貝。
(7)在重新定義拷貝構造函數(shù)之后,默認拷貝構造函數(shù)和默認構造函數(shù)就不存在了。
???????? 在重新定義構造函數(shù)后,默認拷貝構造函數(shù)還在,默認構造函數(shù)不存在。
(8)在對象進行賦值時,拷貝構造函數(shù)不被調(diào)用。此時進行的是結構式的拷貝。
拷貝構造函數(shù)與對象賦值的區(qū)別:拷貝構造函數(shù)是用一個存在的對象去構造一個不存在的對象;對象賦值是當兩個對象都存在,用一個對象的值去覆蓋一個對象的值。
淺拷貝和深拷貝:
深拷貝:實現(xiàn)原對象和新對象之間數(shù)據(jù)成員之間的拷貝,而且可以為新的對象分配單獨的內(nèi)存資源。
淺拷貝:直接將原對象的數(shù)據(jù)成員值依次復制給新對象中對應的數(shù)據(jù)成員,并沒有為新對象另外分配內(nèi)存資源。
4、賦值運算符重載函數(shù)
運算符重載定義:使同一個運算符作用與不同類型的數(shù)據(jù)時導致不同行為的一種機制。
形式:返回值 operator 運算符(參數(shù)列表)
運算符函數(shù)的參數(shù)至少有一個必須是類的對象或者類的對象的引用。這種規(guī)定可以防止改變內(nèi)置類型的函義。
?? 5個不能重載的運算符:
. (成員訪問運算符)
.* (成員指針訪問運算符)
:: (域運算符)
sizeof (長度運算符)
?: (條件運算符)
規(guī)則:
(1)重載后運算符的優(yōu)先級與結合性不會改變
(2)不能改變原運算符操作數(shù)的個數(shù)
(3)不能重載C++中沒有的運算符
(4)不能改變運算符的原有語義。
5、取地址操作符重載函數(shù)
Clock * operator() {return this; }6、const修飾的取地址符重載函數(shù)
const Clock * operator&() const {return this; }?
?
?
?
?
總結
以上是生活随笔為你收集整理的C++的六个默认函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言建立顺序表 存储并输出,请教数据结
- 下一篇: 初识C++之剖析const与#defin