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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++中类的6个默认成员函数

發(fā)布時(shí)間:2024/4/11 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中类的6个默认成员函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

類的6個(gè)默認(rèn)成員函數(shù)

文章目錄

  • 類的6個(gè)默認(rèn)成員函數(shù)
    • 一、構(gòu)造函數(shù)
    • 二、析構(gòu)函數(shù)
    • 三、拷貝構(gòu)造函數(shù)
    • 四、運(yùn)算符重載
    • 五、取地址操作符重載和const修飾的去地址操作符重載

一、構(gòu)造函數(shù)

  • 構(gòu)造函數(shù):是一個(gè)特殊的成員函數(shù),名字與類名相同,創(chuàng)建對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,保證每個(gè)成員函數(shù)都有一個(gè)初值,
  • 注意,構(gòu)造函數(shù)只是給類成員賦了一個(gè)初值,并不能稱為給類成員進(jìn)行初始化,因?yàn)槌跏蓟荒苡幸淮?#xff0c;而構(gòu)造函數(shù)可以進(jìn)行多次賦值,并且在對(duì)象生命周期內(nèi)只調(diào)用一次,沒(méi)有返回值。
  • 初始化列表:是初始化類中每個(gè)變量,如果類成員包含引用類型成員變量、const成員變量、類類型成員變量(改類沒(méi)有默認(rèn)構(gòu)造函數(shù))則這些成員變量必須放在初始化列表位置進(jìn)行初始化,另外,每個(gè)成員變量只能在初始化列表出現(xiàn)一次。

注意:

  • 函數(shù)名必須和類名相同;
  • 無(wú)返回值
  • 構(gòu)造函數(shù)可以重載;
  • 構(gòu)造函數(shù)的作用是初始化對(duì)象,并不是開(kāi)空間創(chuàng)建對(duì)象
  • 如果類中沒(méi)有顯式定義構(gòu)造函數(shù),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)無(wú)參數(shù)的構(gòu)造函數(shù),一旦用戶顯式定義,編譯器就不再生成
  • 無(wú)參數(shù)的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)的構(gòu)造函數(shù),并且默認(rèn)的構(gòu)造函數(shù)只能有一個(gè),(我們沒(méi)有顯式定義構(gòu)造函數(shù),編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為是默認(rèn)成員函數(shù))

二、析構(gòu)函數(shù)

  • 析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,注意析構(gòu)函數(shù)不是完成對(duì)象的銷毀,局部對(duì)象的銷毀是由編譯器完成的,而對(duì)象在銷毀前,會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成一些對(duì)象的資源清理工作。

注意:

  • 構(gòu)造函數(shù)名是在類名前加~符號(hào)
  • 無(wú)參數(shù)無(wú)返回值,就沒(méi)有函數(shù)重載;
  • 一個(gè)類有且只有一個(gè)析構(gòu)函數(shù),若未顯式定義,編譯器會(huì)默認(rèn)生成一個(gè);
  • 在對(duì)象生命周期結(jié)束時(shí),編譯器系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)

三、拷貝構(gòu)造函數(shù)

  • 拷貝構(gòu)造函數(shù):用已存在類類型對(duì)象創(chuàng)建新對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,只有單個(gè)類類型引的型參,且一般用const修飾。(注意深淺拷貝問(wèn)題,會(huì)在后面解決)

注意:

  • 拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的重載形式
  • 參數(shù)必須使用引用傳參,使用按值傳參,會(huì)引發(fā)無(wú)窮遞歸調(diào)用進(jìn)行創(chuàng)建臨時(shí)對(duì)象;
  • 最最重要的是:如果未顯示定義拷貝構(gòu)造函數(shù),系統(tǒng)會(huì)默認(rèn)生成按值傳參的拷貝構(gòu)造函數(shù),即淺拷貝或值拷貝

四、運(yùn)算符重載

  • 運(yùn)算符重載:是為了加強(qiáng)代碼的可讀性而引入的,運(yùn)算符重載是具有特殊函數(shù)名的函數(shù),有參數(shù)有返回值;
  • 對(duì)于賦值運(yùn)算符重載問(wèn)題:一個(gè)類中一旦涉及資源管理問(wèn)題,用戶必須顯式定義賦值運(yùn)算符重載(注意深淺拷貝問(wèn)題)。函數(shù)原型為:返回值類型 operator 要重載的操作符 (參數(shù))

注意:

  • 不能通過(guò)鏈接其他符號(hào)來(lái)創(chuàng)建新的操作符,如operator@;
  • 重載操作符必須有一個(gè)類類型的或枚舉類型的操作數(shù);
  • 并且不能隨意更改內(nèi)置類型的操作符的含義
  • 作為類成員的重載函數(shù)時(shí),形參看起來(lái)比操作數(shù)數(shù)目少一個(gè),其實(shí)是有一個(gè)默認(rèn)的形參this作為第一個(gè)參數(shù)
  • 最最最最最重要的是".*"、"sizeof"、"?:"、"."、"::"五個(gè)運(yùn)算符不能重載
  • 還有注意前置++(不帶參數(shù))、后置++(帶一個(gè)參數(shù))和=運(yùn)算符的重載

五、取地址操作符重載和const修飾的去地址操作符重載

  • 取地址操作符重載和const修飾的取地址操作符重載:一般不用重新定義,編譯器會(huì)默認(rèn)生成

簡(jiǎn)單歸納:

函數(shù)返回值參數(shù)作用
構(gòu)造函數(shù)無(wú)返回值有參和無(wú)參兩種初始化對(duì)象
析構(gòu)函數(shù)無(wú)返回值無(wú)參數(shù)對(duì)象生命周期結(jié)束時(shí),在對(duì)象刪除前做清理工作
拷貝構(gòu)造函數(shù)無(wú)返回值引用類型的參數(shù)用已存在的對(duì)象創(chuàng)建新的對(duì)像
運(yùn)算符重載不定至少有一個(gè)方便C++中的操作

還有兩個(gè)默認(rèn)成員函數(shù)一般不用重新定義(取地址操作符重載和const修飾的去地址操作符重載)

注意:

  • 1:const對(duì)象可以調(diào)用其他的const成員函數(shù),而不能調(diào)用非const成員函數(shù)。
  • 2.非const對(duì)象既可以調(diào)用const成員函數(shù)也可以調(diào)用非const成員函數(shù)。
  • 3.const成員函數(shù)可以調(diào)用其他的const成員函數(shù),而不能調(diào)用非const成員函數(shù)
  • 4.非const成員函數(shù)既可以調(diào)用其他的const成員函數(shù),也可以調(diào)用非const成員函數(shù)。
#include<iostream> #include<windows.h> using namespace std;class Date { public:Date(){_year = 1998;_month = 7;_day = 22;}Date(int year, int month, int day){_year = year;_month = month;_day = day;}~Date(){_year = 1998;_month = 7;_day = 22;}Date(Date& ra){_year = ra._year;_month = ra._month;_day = ra._day;}Date& operator=(Date& ra){_year = ra._year;_month = ra._month;_day = ra._day;return *this;}Date& operator+(int day){_day += day;return *this;}Date& operator-(int day){_day -= day;return *this;}Date& operator++(){_day += 1;return *this;}Date operator++(int)//后置++因?yàn)橐祷貨](méi)有加1之前的,所以創(chuàng)建類類型變量(不能是類類型的引用)存儲(chǔ)起來(lái),方便返回,注意和前置++返回值及參數(shù)的區(qū)別{Date temp = *this;_day += 1;return temp;}Date& operator--(){_day -= 1;return *this;}Date operator--(int){Date temp = *this;_day -= 1;return temp;}bool operator>(const Date& ra)const{if (_year > ra._year){return true;}else if(_year==ra._year &&_month>ra._month ){return true;}else if (_year == ra._year &&_month == ra._month&&_day > ra._day){return true;}else{return false;}}bool operator==(const Date& ra)const{if (_year == ra._year &&_month == ra._month&&_day == ra._day){return true;}else{return false;}}bool operator>=(const Date& ra)const{if (this->operator>(ra) || this->operator==(ra)){return true;}else{return false;}}bool operator < (const Date& ra)const{if (this->operator>(ra)){return false;}else{return true;}}bool operator<=(const Date& ra)const{if (this->operator<(ra) || this->operator==(ra)){return true;}else{return false;}}bool operator!=(const Date& ra)const{if (this->operator==(ra)){return false;}else{return true;}}void Show(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day; };int main() {Date a(2019, 10, 20);a.Show();Date b(a);b.Show();Date c(2019, 10, 22);c.Show();//cout << a>b << endl;//cout << a.==b << endl;//cout << a>=c << endl;cout << a!=b << endl;cout << a<=b<< endl;cout << a!=c << endl;cout << a<=c << endl;system("pause");return 0; }

總結(jié)

以上是生活随笔為你收集整理的C++中类的6个默认成员函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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