原创 翻轉單鏈表

結點類型 class list{ public: list(int num = 0){ this->m_num = num; this->m_next = NULL; } public: int m_num;

原创 遞歸

什麼問題可以用遞歸? 當前問題可以進行拆分,拆分爲子問題。子問題的本質和父問題是一樣的,解決了子問題,父問題也就迎刃而解。同時子問題可以繼續向下分解。 例如:數組排序問題 分解爲數組左邊部分排序和又邊部分排序 找數組最大數問題 找

原创 對數器

當我們想出一個複雜度低算法時,如何對算法的準確性進行判斷呢?使用對數器 方法: 你想要測試的方法a 覺得正確不考慮複雜度的算法b 產出隨機樣本 用b和a對樣本進行處理 比對處理結果 反覆進行3~5 當樣本足夠多時 可以認爲正確

原创 c++中的類型轉換

double pi = 3.14; int num1 = pi; int num2 = static_cast<int> (pi);//用於基礎類型轉換 不包括指針 char*ch = "nihao "; int*

原创 類模板

單個模板類 template<typename T> class A{ public: A(T a= 0):m_a(a){} void print(){ cout << "a = " << this->m_a << end

原创 函數模板和類模板

函數模板也可以提前聲明,不過聲明時需要帶上模板頭,並且模板頭和函數定義(聲明)是一個不可分割的整體,它們可以換行,但中間不能有分號。 類模板,在類外定義成員函數時不僅要加模板頭,在類名的後面還有加上類型參數 例如: templat

原创 模板顯示具體化

什麼是顯示具體化 模板能夠針對某種具體的類型使用不同的算法(函數體或類體不同) 例如 template<class T> const T& Max(const T& a, const T& b){ return a > b

原创 再談構造函數

創建一個類,一定要調用構造函數,那麼構造函數包括哪些種類呢? 默認構造函數 沒有定義構造函數時使用,默認構造函數 默認無參構造函數,函數體爲空,什麼內容都沒有 默認拷貝構造函數,注意:當沒有自定義拷貝構造函數時,使用拷貝構造是調

原创 運算符重載

算符重載是通過函數實現的,它本質上是函數重載。運算符重載函數除了函數名有特定的格式,其它地方和普通函數並沒有區別。 操作符重載規則 並不是所有的運算符都可以重載。 重載不能改變運算符的優先級和結合性 重載不會改變運算符的用法,原

原创 const成員變量和const成員函數和const對象

const成員變量 只能使用初始化列表對,const成員變量初始化’ const成員函數 可以使用所有的成員變量,但是不能對其進行修改 使用方法: 在函數的聲明和定義處最後加上const 例如: int getage() cons

原创 繼承與派生

三種方式 在派生類中訪問基類 private 成員的唯一方法就是藉助基類的非 private 成員函數,如果基類沒有非 private 成員函數,那麼該成員在派生類中將無法訪問。 C++繼承時的名字遮蔽問題 派生類的成員(成員函數

原创 類和對象

類 類相當於一個模板,編譯後不會佔用內存空間的,所以類在定義的時候是不能對類的成員進行初始化的,因爲沒有地方存儲,只有在類實體化對象後才能初始化。 對象創建方式: 棧上構建 用.訪問 堆上構建 用->訪問 類的成員函數 類中的

原创 函數重載

什麼是函數重載 函數名相同,但是參數類型,個數,順序不相同的函數(其實就是參數列表不用),注意返回值不是函數重載的判斷依據 要求: 函數名相同 參數列表不同 編譯器是如何知道該使用哪個重載函數的 從本質上來說重載函數的函數名是

原创 默認參數

什麼是默認參數 當函數調用時,省略了參數時,會自動使用的值(默認參數),如沒有省略參數則使用輸入的參數。 默認參數可以使用那些值 常量 如 void func(int a, int b=10, int c=20) 全局變量

原创 Linux中c語言的內存佈局

以Linux下的32位環境爲例子 內核空間和用戶空間 32位環境理論有4g的虛擬地址空間,其中1G交給操作系統內核使用(內核空間),剩下3G交給用戶使用(用戶空間) 經典內存模型 內存分區 說明 程序代碼區 存放函