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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++面向对象笔记:构造、析构函数、成员函数

發(fā)布時(shí)間:2025/3/15 c/c++ 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++面向对象笔记:构造、析构函数、成员函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

構(gòu)造函數(shù):用以對(duì)類中數(shù)據(jù)成員進(jìn)行初始化

系統(tǒng)會(huì)自動(dòng)生成默認(rèn)構(gòu)造函數(shù)(參數(shù)為空),但是若手動(dòng)定義了帶參的構(gòu)造函數(shù),會(huì)自動(dòng)覆蓋默認(rèn)構(gòu)造函數(shù)時(shí)若需要調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行實(shí)例化,需要手動(dòng)定義一個(gè)不帶參的構(gòu)造函數(shù)

初始化列表:可通過初始化列表的方式對(duì)類數(shù)據(jù)成員進(jìn)行初始化,如定義初始化列表:User():sId(0001),sSex(1)

繼承基類時(shí)在派生類中調(diào)用基類的構(gòu)造函數(shù),對(duì)基類進(jìn)行初始化,實(shí)際上就是初始化列表。

構(gòu)造函數(shù)可以只在類體內(nèi)聲明,在類體外定義,且聲明時(shí)不需要初始化列表,在定義時(shí)需要給出初始化列表(若有)。

  有兩種情況需要初始化列表:

  •   數(shù)據(jù)成員中有常量成員:const int Id;
  •   數(shù)據(jù)成員中有子對(duì)象,在類中包含另一個(gè)類對(duì)象:Group group1;
  •   因?yàn)闃?gòu)造函數(shù)的執(zhí)行順序如下:

  •   分配內(nèi)存
  •   初始化成員列表
  •   執(zhí)行構(gòu)造函數(shù)
  •   常量成員不能放在構(gòu)造函數(shù)中:常量成員聲明后無法修改,只能放在初始化列表中;

      子對(duì)象:定義類對(duì)象首先要分配內(nèi)存,如果包含另外的類對(duì)象,也需要為其分配內(nèi)存,所以另外的類對(duì)象初始化要先于構(gòu)造函數(shù)執(zhí)行;

    類的數(shù)據(jù)成員與成員函數(shù)是分開存放的,數(shù)據(jù)成員存放堆棧區(qū),成員函數(shù)存放在代碼區(qū),成員函數(shù)通過this指針訪問其自身對(duì)象

    靜態(tài)成員:

    靜態(tài)成員存放在靜態(tài)全局區(qū),與類實(shí)際上沒有太大的關(guān)系。靜態(tài)成員生存期為整個(gè)程序運(yùn)行期,進(jìn)程結(jié)束才釋放!

    靜態(tài)成員需要在類體外定義(已在構(gòu)造函數(shù)中初始化)或者初始化才能使用。

    靜態(tài)與非靜態(tài)的相互訪問:

    經(jīng)測(cè)試,構(gòu)造函數(shù)也可以初始化靜態(tài)成員,當(dāng)然,其他的成員函數(shù)也可以操作靜態(tài)成會(huì)員。

    但是靜態(tài)成員函數(shù)要想訪問非靜態(tài)成員,需要特殊處理:傳遞具體的類對(duì)象給靜態(tài)成員函數(shù),再通過該類對(duì)象訪問非靜態(tài)成員。

    常成員函數(shù):若一個(gè)成員函數(shù)用const修飾,則不允許修改內(nèi)部成員,相當(dāng)于對(duì)內(nèi)部this指針加了const修飾,不能通過this->id = ...修改值。

    ?析構(gòu)函數(shù):析構(gòu)函數(shù)的作用并不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存空間前進(jìn)行一些清理工作。

      系統(tǒng)會(huì)自動(dòng)生成函數(shù)體為空的析構(gòu)函數(shù)。

    用途:在有內(nèi)部指針的時(shí)候就要使用析構(gòu)函數(shù)防止內(nèi)存泄漏。

    對(duì)于一般對(duì)象,如User user;出作用域時(shí)會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)

    但對(duì)于動(dòng)態(tài)分配的對(duì)象:User user = new user;即使出了作用域,也不會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù),必須手動(dòng)進(jìn)行delete user,才能調(diào)用析構(gòu)函數(shù)。

    static局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)并不釋放,也不調(diào)用析構(gòu)函數(shù)。只有在main函數(shù)結(jié)束或執(zhí)行exit語句,才調(diào)用static對(duì)象析構(gòu)函數(shù)

    析構(gòu)函數(shù)同樣可以定義在類體外,函數(shù)聲明在類體內(nèi)部;

    析構(gòu)函數(shù)執(zhí)行順序:

      對(duì)于同類型對(duì)象,先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。

      原因:因?yàn)閷?duì)象是存在于堆棧中,先進(jìn)后出。

    1 class CMyClass 2 { 3 public: 4 CMyClass():iNo(0) 5 {} 6 CMyClass(int i):iNo(i) 7 { 8 this->iId = i; 9 CMyClass(); 10 } 11 public: 12 int iId; 13 const int iNo; 14 };

    ?

    構(gòu)造函數(shù):在建立對(duì)象時(shí)自動(dòng)執(zhí)行構(gòu)造函數(shù)

    CMyClass myObject; //自動(dòng)執(zhí)行構(gòu)造函數(shù)

    有參構(gòu)造函數(shù):

    CMyClass myObject(1);//自動(dòng)執(zhí)行構(gòu)造函數(shù)

    一個(gè)構(gòu)造函數(shù)中也可以手動(dòng)調(diào)用另一個(gè)構(gòu)造函數(shù),但是若被調(diào)用的構(gòu)造函數(shù)聲明時(shí)帶有初始化參數(shù)列表,但是參數(shù)初始化列表此時(shí)不會(huì)執(zhí)行

    只有系統(tǒng)自動(dòng)調(diào)用時(shí)才會(huì)執(zhí)行參數(shù)初始化列表

    如上例,在CMyClass(int i) 中調(diào)用MyClass(),不會(huì)執(zhí)行初始化列表iNo(0);

    調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序:
    1、全局對(duì)象:構(gòu)造函數(shù)在文件中的所有函數(shù)執(zhí)行之前調(diào)用,main函數(shù)執(zhí)行完畢或調(diào)用exit時(shí)執(zhí)行析構(gòu)函數(shù)
    2、靜態(tài)局部:在程序中第一此調(diào)用此靜態(tài)局部對(duì)象所在的函數(shù)時(shí)調(diào)用構(gòu)造函數(shù)一次,調(diào)用結(jié)束后并不釋放,main函數(shù)執(zhí)行完畢或調(diào)用exit時(shí)執(zhí)行析構(gòu)函數(shù)
    3、局部自動(dòng)對(duì)象:在建立對(duì)象時(shí)調(diào)用其構(gòu)造函數(shù),其所在函數(shù)執(zhí)行完畢對(duì)象釋放時(shí),調(diào)用其析構(gòu)函數(shù)

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/jiese/archive/2012/07/03/2574090.html

    總結(jié)

    以上是生活随笔為你收集整理的C++面向对象笔记:构造、析构函数、成员函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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