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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++的六个默认函数

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

C++中,類有六個默認函數,分別是:

目錄

1、構造函數

2.析構函數??

3.拷貝構造函數

4、賦值運算符重載函數

5、取地址操作符重載函數

6、const修飾的取地址符重載函數


1、構造函數

定義:在定義一個對象的同時,希望能給它的數據成員賦值——對象的初始化的成員函數,叫做構造函數。

在C++中,由于類的封裝性,它不允許在類的非成員函數中直接訪問類對象的私有和保護數據成員,不能在建立類的時候初始化。所以對于類對象數據成員的初始化工作就落到了類對象的成員函數身上,因為它們可以訪問類對象的私有和保護成員。

#include<iostream> using nmespace std;class Clock { public:Clock()//構造函數{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)函數名與類名是相同的

(2)在建立對象時,系統自動調用的函數。

(3)這個函數體是空的,默認構造函數并不具備任何功能。

(4)可以重載。

(5)不能夠手動調用。

(6)沒有返回值

(7)可以在類中定義,也可以在類外定義。

(8)如果用戶為類定義了一個構造函數,系統就不會生成任何默認的構造函數。

(9)作為類的成員函數,構造函數可以直接訪問類的所有數據成員,可以是內聯函數,可以不帶任何參數,可以帶有參數表以及默認參數值。

PS: 構造函數與其他成員的區別:

(1)構造函數必須和類名相同,而一般成員函數不能和類名相同。

(2)構造函數主要功能在于類的對象創建時定義初始化的狀態,沒有返回值,不能用void修飾,其他函數可以有返回值,也可以沒有,但是必須用void予以說明。

(3)構造函數不能被直接調用,一般成員函數在程序執行時被調用。

2.析構函數??

(~構造函數名)

~Clock() {cout << "~Clock" << endl; }

定義:在特定對象使用結束后,需要進行一些清理工作由特殊成員函數完成,叫做析構函數。

特點:

(1)沒有任何參數,不能被重載,但可以是虛函數,一個類只能有一個析構函數。

(2)沒有返回值。

(3)析構函數一般由用戶自己定義,在對象消失時由系統自動調用。

(4)默認析構函數是空函數,不做任何事。

3.拷貝構造函數

類名(類型 & 變量名)

Clock(Clock & p)//拷貝構造函數 {cout << "copy Clock(Clock &p)" << endl;hour = p.hour;minute = p.minute;second = p.second; }

定義:用于在建立新對象時將已存在對象的數據成員值拷貝給新對象,即用一個已存在的對象去初始化一個新建立的對象。

形式:

類名(類名 & 對象名)

{ ... }?? //函數體

特點:

(1)拷貝構造函數其實是構造函數的重載

(2)拷貝構造函數的參數必須使用引用傳參,不能使用傳值傳參

(3)如果用戶沒有定義拷貝構造函數,系統會默認缺省的拷貝構造函數,缺省的拷貝構造函數會依次拷貝類成員進行初始化

PS:

(1)默認的拷貝構造函數是淺拷貝。如果類成員變量有指針,考慮實現深拷貝。

(2)形參一定要加引用。

(3)拷貝構造函數與構造函數有且只會調用一個。

(4)用一個常量初始化新建立的對象時,調用構造函數,不調用拷貝構造函數。

(5)當對象作為函數的返回值時需要調用拷貝構造函數,此時C++將從堆中動態建立一個臨時對象,將函數的返回的對象拷貝給該臨時對象, 并把該臨時對象的地址存儲在寄存器里,從而由該臨時對象完成函數返回值的傳遞。

(6)默認的拷貝構造函數是淺拷貝。

(7)在重新定義拷貝構造函數之后,默認拷貝構造函數和默認構造函數就不存在了。

???????? 在重新定義構造函數后,默認拷貝構造函數還在,默認構造函數不存在。

(8)在對象進行賦值時,拷貝構造函數不被調用。此時進行的是結構式的拷貝。

拷貝構造函數與對象賦值的區別:拷貝構造函數是用一個存在的對象去構造一個不存在的對象;對象賦值是當兩個對象都存在,用一個對象的值去覆蓋一個對象的值。

淺拷貝和深拷貝:

深拷貝:實現原對象和新對象之間數據成員之間的拷貝,而且可以為新的對象分配單獨的內存資源。

淺拷貝:直接將原對象的數據成員值依次復制給新對象中對應的數據成員,并沒有為新對象另外分配內存資源。

4、賦值運算符重載函數

運算符重載定義:使同一個運算符作用與不同類型的數據時導致不同行為的一種機制。

形式:返回值 operator 運算符(參數列表)

運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。這種規定可以防止改變內置類型的函義。

?? 5個不能重載的運算符:

. (成員訪問運算符)
.* (成員指針訪問運算符)
:: (域運算符)
sizeof (長度運算符)
?: (條件運算符)

規則:

(1)重載后運算符的優先級與結合性不會改變

(2)不能改變原運算符操作數的個數

(3)不能重載C++中沒有的運算符

(4)不能改變運算符的原有語義。

5、取地址操作符重載函數

Clock * operator() {return this; }

6、const修飾的取地址符重載函數

const Clock * operator&() const {return this; }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的C++的六个默认函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。