C++学习笔记系列二
生活随笔
收集整理的這篇文章主要介紹了
C++学习笔记系列二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、第一部分
1、C++程序內存分配方式
- 棧區(stack):由編譯器自動分配釋放,堆區(heap):一般由程序員分配釋放,不會隨著函數棧的銷毀而銷毀,有程序員釋放,或程序執行完成,有OS回收、全局/靜態區( static):全局變量和靜態變量的存儲,文字常量區:存放常量字符串 5)、程序代碼區:存放函數體(類的成員函數、全局函數)的二進制代碼
- 棧區是向下生長的,堆區是向上生長的。
- 文字常量區的內容,不能修改,只能讀取,局部常量區與全局變量,在內存里的同一區域。
- 對于const 全局常量(放在文字常量區)與const 的局部變量(在函數棧空間)在內存中的,需要明確變量的生命周期。
2、類和對象 ? (重點掌握)
- 面向對象是一種編程思想,認為現實世界是由對象組成的,對象由相關的數據和操作組成,程序 = 對象 + 對象 + … + 對象
- 類和對象是“一般和特殊”,類的提取:一是特征(屬性),另一個是功能(行為)
- 其基本形式如下:
-
- class 類名 {
-
-
- public: ? ? 公共成員變量和函數(視它為接口,表示能夠對外能夠提供的服務)
- protected: ? ? 保護成員變量和函數、用于繼承
- private: ? ? ? ? 私有成員變量和函數
- };? ? //不要漏寫了這個分號;
-
- 對于類里面的成員,加上一個下劃線 ? eg: ? char ?_brand[20}; ?用來標示它屬于這個類,這是一種編碼風格。對于成員函數,有兩種實現,類之內實現,和類之外實現。對于private:的成員是私有的,不能再類之外,去直接訪問,只能在類之內直接區訪問。(private表示的是封裝特性)對于,在類之外,只能通過public 的函數區修改它的值,對于struct的不足,都可以直接訪問成員,不安全,對于該名字,需要全部替換,對于class,只用修改函數定義的地方該就行了,如果private,其他人是不可見的。
- 對于struct 結構體和類的差別,class的默認訪問權限是私有的,而,struct的默認訪問權限是共有的(public的)
- protected 關鍵字,在類之外也是不能直接使用,在繼承處多使用,交給派生類區使用。
- 當在類外部去實現函數是,要在函數名前加上類名,作為作用域,eg: void ?computer: setprice( );
- C++為類提供了兩種特殊的成員函數--構造函數、析構函數來完成,實現對數據成員的初始化。
- 構造函數,在對象創建時自動調用,用以完成對象成員變量等的初始化及其他操作(如為指針成員動態申請內存空間等);如果程序員沒有顯式的定義它,系統會提供一個默認的構造函數。函數的名字與類名相同,沒有返回類型和返回值,即使是void也不能有。創建對象時也可以省略參數。
- 析構函數,在對象撤銷時自動調用,用以執行一些清理工作的,如釋放成員函數中動態申請的內存等。如果程序員沒有顯式的定義它,系統也會提供一個默認的析構函數。以波浪號開頭,沒有 沒有返回類型,也不能指定參數,因此,析構函數只能有一個,不能被重載。
-
- 如果沒有顯示定義一個析構函數,系統便會默認提供。
- 當自己定義一個有參構造函數時,系統便不會提供默認的無參構造函數了。此時,如果還希望能夠調用默認構造函數創造對象,則必須自己顯式定義默認的構造函數。說明構造函數是可以實現重載的
- 初始化表達式(列表)、只要將成員初始化表達式放在構造函數的頭和體之間,并用冒號將其與構造函數的頭分隔開,便可實現數據成員表中元素的初始化 。
游戲引擎,(前端方面) cocos2dx ? ? ?觸控科技,可以閱讀源碼。純C++實現,C++ 11標準
二、第二部分
- 當把一個已經存在的對象賦值給另一個新的對象時。
- 當實參和形參都是對象,進行形參和實參的結合時。
- 當函數的返回值是對象,函數調用完成返回時。(?但編譯器會優化,默認是看不到的,可以加上 -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
- 其作用是將
-
-
- 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++学习笔记系列二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字化技术浪潮下,医院临床科研如何「华丽
- 下一篇: ANSI C and Microsoft