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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++学习笔记系列二

發布時間:2025/3/15 c/c++ 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习笔记系列二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、第一部分


1、C++程序內存分配方式


  • 棧區(stack):由編譯器自動分配釋放,堆區(heap):一般由程序員分配釋放,不會隨著函數棧的銷毀而銷毀,有程序員釋放,或程序執行完成,有OS回收、全局/靜態區( static):全局變量和靜態變量的存儲,文字常量區:存放常量字符串 5)、程序代碼區:存放函數體(類的成員函數、全局函數)的二進制代碼
  • 棧區是向下生長的,堆區是向上生長的。
  • 文字常量區的內容,不能修改,只能讀取,局部常量區與全局變量,在內存里的同一區域。
  • 對于const 全局常量(放在文字常量區)與const 的局部變量(在函數棧空間)在內存中的,需要明確變量的生命周期。

2、類和對象 ? (重點掌握)
  • 面向對象是一種編程思想,認為現實世界是由對象組成的,對象由相關的數據和操作組成,程序 = 對象 + 對象 + … + 對象
  • 類和對象是“一般和特殊”,類的提取:一是特征(屬性),另一個是功能(行為)
  • 其基本形式如下:
    • class 類名 {
        • public: ? ? 公共成員變量和函數(視它為接口,表示能夠對外能夠提供的服務)
        • protected: ? ? 保護成員變量和函數、用于繼承
        • private: ? ? ? ? 私有成員變量和函數
        • };? ? //不要漏寫了這個分號;
?????//在類內部實現的函數,默認情況下是inline 函數
  • 對于類里面的成員,加上一個下劃線 ? eg: ? char ?_brand[20}; ?用來標示它屬于這個類,這是一種編碼風格。對于成員函數,有兩種實現,類之內實現,和類之外實現。對于private:的成員是私有的,不能再類之外,去直接訪問,只能在類之內直接區訪問。(private表示的是封裝特性)對于,在類之外,只能通過public 的函數區修改它的值,對于struct的不足,都可以直接訪問成員,不安全,對于該名字,需要全部替換,對于class,只用修改函數定義的地方該就行了,如果private,其他人是不可見的。
  • 對于struct 結構體和類的差別,class的默認訪問權限是私有的,而,struct的默認訪問權限是共有的(public的)
  • protected 關鍵字,在類之外也是不能直接使用,在繼承處多使用,交給派生類區使用。
  • 當在類外部去實現函數是,要在函數名前加上類名,作為作用域,eg: void ?computer: setprice( );
  • C++為類提供了兩種特殊的成員函數--構造函數、析構函數來完成,實現對數據成員的初始化。
  • 構造函數,在對象創建時自動調用,用以完成對象成員變量等的初始化及其他操作(如為指針成員動態申請內存空間等);如果程序員沒有顯式的定義它,系統會提供一個默認的構造函數。函數的名字與類名相同,沒有返回類型和返回值,即使是void也不能有。創建對象時也可以省略參數。
  • 析構函數,在對象撤銷時自動調用,用以執行一些清理工作的,如釋放成員函數中動態申請的內存等。如果程序員沒有顯式的定義它,系統也會提供一個默認的析構函數。以波浪號開頭,沒有 沒有返回類型,也不能指定參數,因此,析構函數只能有一個,不能被重載。
    • 如果沒有顯示定義一個析構函數,系統便會默認提供。
  • 當自己定義一個有參構造函數時,系統便不會提供默認的無參構造函數了。此時,如果還希望能夠調用默認構造函數創造對象,則必須自己顯式定義默認的構造函數。說明構造函數是可以實現重載的
  • 初始化表達式(列表)、只要將成員初始化表達式放在構造函數的頭和體之間,并用冒號將其與構造函數的頭分隔開,便可實現數據成員表中元素的初始化 。
Point : _ix(0) ? ?//建議一行初始化一個元素的寫法。 ,_iy(0) ? ? //初始化表達式(列表)初始化順序只跟元素在類中被聲明的順序有關,并不是有初始化列表的順序進行的。 { ? ? ?cout<<_ix<<_iy; }
游戲引擎,(前端方面) cocos2dx ? ? ?觸控科技,可以閱讀源碼。純C++實現,C++ 11標準

二、第二部分

  • 對于直接copy 指針首地址,叫淺拷貝,先開辟空間,在copy叫深拷貝。
  • 對于棧對象而言,當其生命周期結束時,就會自動調用析構函數。析構函數可以被顯式調用的,但一般是不推薦這樣使用的。而對于堆空間,new出來的空間(Com *pc2=new Com()),我們就需要手動去釋放。delete ?pc2 ? 。對于全局變量和局部變量,會在函數結束后在默認調用析構函數。
  • 復制構造函數。(重點)C++中經常使用一個常量或變量初始化另一個變量,對于類也是可以的,以point類為例: point pt1(2,3);? point pt2=pt1; 或者point pt2( pt1); ? //因為系統默認的提供了一個復制構造函數。如:point:: point (const point &); ?當系統默認提供的復制構造函數不能滿足需求時,只能自己去定義復制構造函數。 ? ---首先 復制構造函數的引用符號&不能少,否則在調用復制構造函數會導致無窮遞歸,直到棧溢出,---其次,它的const 關鍵字也不能去掉。如果去掉,右值形式存在的對象無法進行傳參。匿名對象--->存在時間非常短,也是右值// ?const Point rhs=rfs ;是不行的。
  • 復制構造函數調用機制 ??
    • 當把一個已經存在的對象賦值給另一個新的對象時。
    • 當實參和形參都是對象,進行形參和實參的結合時。
    • 當函數的返回值是對象,函數調用完成返回時。(?但編譯器會優化,默認是看不到的,可以加上 -fno-elide-constructors編譯選項,查看

    g++ ?point.cc ?-fno-elide-constructors ? ? ?? 5、賦值運算符 =
    • 成員函數形式的運算符聲明和實現與成員函數類似,首先應當在類定義中聲明該運算符,
      • 如果沒有提供賦值運算符函數,系統會默認提供一個賦值運算符函數。? 形式: Point & operator=(const Point & rhs) ?在類之內定義時,形式為:?聲明的具體形式: 返回類型 operator 運算符(參數列表); ?
      • ?當在類之外去定義賦值運算符時,形式為:返回類型? 類名::operator 運算符(參數列表)
      • --> ?* this指針指向當前對象本身,是第一個隱含的this指針,形式為 ?Point *const this ?;operator= ? 是一個函數名。c1= c3 ?等價于 ?c1.operator = (c3 )
      • 1、對于自賦值問題,2、回收右操作數 的空間 3、在去進行深拷貝
      • 注意:左操作數就是在數據的左邊去操作數據。同理,右操作數。
    • 特殊數據成員的初始化
      • 對于const 數據成員只能在初始化列表去初始化。
      • 對于引用數據成員也只能在初始化列表去初始化。
      • 對象成員在傳參時,也應該放在初始化列表之中初始化,盡量。
      • 靜態數據成員由該類的所有對象共享。靜態數據成員的初始化必須在類申明之外進行,且不再包含static關鍵字,格式如下:
        • 類型 類名::變量名 = 初始化表達式; //普通變量 類型 ? 類名::對象名(構造參數);? ? ?//對象變量
        • 如float computer::total_price = 0; ? //在全局區。

    • 特殊函數成員
      • 靜態成員函數體內不能訪問使用非靜態的成員變量和非靜態的成員函數;只能調用靜態成員數據和函數 ?--->因為靜態成員函數的參數列表中不含有this指針
      • 若果沒要訪問,只有通過傳參數了(const ?Computer & com) ?,靜態成員函數直接通過類名進行訪問。
      • const成員函數 ,const關鍵字放在函數的參數表和函數體之間,稱為const成員函數?
        • eg:void print() const
        • 其作用是將
    ? ? ? ? ? ? ? ? ? ? ?????void print() const => void? print( const ? ? ? ? ? ? ? ? ? ? ?????Point * const this)? const
        • const對象只能調用const 版本的成員函數
        • 非const對象是可以調用const 版本的成員函數的。
        • 如果兩個成員函數同時出現,則兩個不同的對象各自調用自己的成員函數
    • 程序在結束的時候,系統會自動析構所有的全局變量。事實上,系統也會析構所有的類的靜態成員變量,就像這些靜態成員也是全局變量一樣。
    • 對于空的對象時,其大小不是0,為了取地址,必須給他一個空間,故它占一個空間。 ?
    • 對于cout來說,cout對象不能輸出空指針,否則程序就會可能不會正常運行。對于類型不同的類來說,當使用賦值運算符時,會有隱式轉換,--> eg : Point pt=1; ? 若不希望發生隱式轉換,則加上?explicit關鍵字,顯示轉換禁止隱式轉換。
    • 如果用數組來實現隊列,使用頭尾指針
      • 隊列為空: ? ?? front ?== ?rear?
      • 隊列已滿: ? ??(rear + 1)% size == front
      • 往隊列中添加元素: arr[ rear++] = val ; ? ? ? ? ? ?rear % =size ? ? ?此時我們假設全滿是隊列元素減一,即留下一個不放。
      • 從隊列取出元素: ++ front ; ?front % = size ;
      • 獲取對頭元素: ?return ?arr [ front];
      • 獲取隊尾元素return arr [ (rear -1 +size) % size]


    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的C++学习笔记系列二的全部內容,希望文章能夠幫你解決所遇到的問題。

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