日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++的六个默认函数

發(fā)布時間:2024/9/27 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++的六个默认函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。