C++拾憶

一、引用

一、創建引用的時候,必須初始化,引用一旦初始化,就和一個對象綁定,不能再修改成其餘對象的引用算法

二、對引用取地址,和對原始對象取地址,是同一個地址編程

三、不能用作引用的:void、數組設計模式

 

二、內聯函數

一、內聯函數不能包含複雜的結構控制語句,如switch和while。若是包含了,將被視爲普通函數。數組

二、遞歸函數不能做爲內聯函數多線程

三、內聯VS宏  宏不檢查類型,這個不必定是好仍是壞。dom

三、函數重載

函數名相同,參數不一樣。(不以返回值區分)函數

用objdump能夠看符號表,objdump -t main.o工具

以int foo(char,int)爲例,性能

對於C語言來講,不支持重載,因此符號表直接用函數名錶示,就是:foo編碼

但對於C++來講,支持重載,因此符號表只用函數名錶示是不行的,是:_Z3fooci,_Z3是返回值,參數是ci,c表示char,i表示int,具體咋看:https://blog.csdn.net/wdjjwb/article/details/86233389

因此,若是在C++裏要引用C的函數,必需要加extern C,不然聲明的是C++的符號類型。

 

四、函數模板&類模板

一、模板VS宏,模板能夠作類型檢查,這個不必定是好仍是壞。

 二、類模板函數的類外實現

template<class T1,class T2>

void A<T1,T2>::foo(T1 t1,T2 t2)

{}

三、類模板分文件編寫的問題及解決方案: 

問題:連接不到

解決:包含cpp(#include "xxx.cpp")  或者 寫.hpp文件 

五、類和對象

靜態、全局對象會有固定默認值,其餘值的默認值是隨機的。

類前置聲明後,只能使用類的指針和引用,而不能使用類的參數傳遞。

class A;

class B

{

  f(A* a)  //正確

  f1(A& a)  //正確 

  f2(A a) //錯誤

}

六、動態內存分配

動態內存分配函數:

一、malloc/free ,是C的函數,因此也就不會構造/析構;是函數調用,不能重載

二、new/delete :是C++運算符,會調用構造/析構函數;是運算符,能夠重載

三、new[]/delete[]:數組操做,也要配套使用

 

內存區域:

一、數據區:全局變量、靜態數據、常量

1.一、全局變量:

  bss段:存放的是沒有初始化或者初始化爲0的全局變量

  data段:存放初始化爲非零的全局對象。

對於一個全局對象,若是初始化爲0或者沒初始化,可執行文件佔用大小很小,若是初始化爲非0,可執行文件就會很大。

1.二、靜態數據:

  全局變量和靜態變量被分配到同一塊內存中,在之前的 C 語言中,全局變量又分爲初始化的和未初始化的(初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量與靜態變量在相鄰的另外一塊區域,同時未被初始化的對象存儲區能夠經過 void* 來訪問和操縱,程序結束後由系統自行釋放),在 C++ 裏面沒有這個區分了,他們共同佔用同一塊內存區。

1.三、常量

  rodata常量數據區

  rodata存放常量數據

  有些當即數直接和指令編碼在一塊兒,放在text中

  字符串常量,編譯器會去掉重複的字符串,保證只有一個副本

  因此, char* s1 = "abcde";  char* s2 = "abcde";  //s1和s2的地址是同樣的。

  但只有指針直接指向字符串的時候纔會指向常量區的字符串,若是拷貝過,或者數組就不行

     可是數組不行 char a[] =  "abcde";  是把數據區的字符串拷貝到棧區的數組裏了,a是數組首地址。

二、代碼區:全部類的成員函數和非成員函數代碼

三、棧區:爲運行函數而分配的局部變量、函數參數、返回數據、返回地址等

四、堆區:動態內存分配區

 七、拷貝構造函數

class A{  A(const & A);//拷貝構造函數  }

若是沒聲明,會默認提供一個,組個拷貝每一個非static成員。

在傳參和返回值時會隱式調用。

禁止拷貝構造函數的方法:private

八、const

const int *p;  // 指的是 *p 不能修改

int* const p; // 指的是p不能修改

推薦傳遞const引用,而不是傳遞對象,效率更高。

九、友元函數和友元類

友元關係不對稱、不傳遞

A聲明瞭B是友元,那麼B久能夠訪問A的private和protect成員,B能夠是方法或者類。

十、Valgrind內存檢測/性能分析工具

十一、重載運算符

不能重載的運算符:    ::   .*   .    ?:

可使用友元函數或成員函數實現運算符重載,友元函數須要多一個參數,不須要加類做用域。

必須做爲成員函數重載的運算符:     =   ()  []  ->

 前增量重載  A& operator++()

 後增量重載  A operator++(int)

十二、多態

須要多態的函數須要聲明爲virtual

析構函數要申明爲virtual

Java的全部方法都是virtual的

1三、智能指針

SmartPtr是一個模板類

跟shared_ptr不同。

 1四、設計模式

用策略模式替代菱形或其餘複雜的繼承

1五、STL 標準模板庫

字符串: stirng

容器:vector deque stack queue list map set 

算法:

  <algorithm> 包括 :

      比較

      查找find find_if adjacent_find(查相鄰重複的元素) binary_search(二分查找制定元素是否存在,返回bool,速度快,要求有序)

      統計count count_if

      搬運transform

      遍歷for_each

      複製 copy

      替換 replace  replace_if swap(互換)

      排序 sort random_shuffle(洗牌,sort的逆操做)

      合併 merge

      反轉 reverse

      集合函數:set_intersection 求交集,set_union 求並集,set_difference 求差集

 

      等等

  <numeric> 包括 幾個在序列上進行簡單數學運算的模板函數

      accuulate 求和

      fill 將指定區間的元素填充成指定值

  <functional> 定義了一些模板類,用以申明函數對象

 

 

15.一、deque

行爲是一個雙向數組

原理是一個多段數組

VS vector  優勢:雙向,插入塊;缺點:訪問慢

15.二、set vs multiset

multiset能夠插入重複的值。

insert的返回結果是個pair,第一個是插入的迭代器位置,第二個是是否成功,若是是set插入重複的值,實際是插入失敗的。

 

 1六、仿函數

重載了()操做符的函數

16.一、謂詞

返回值爲bool的仿函數

16.二、算數仿函數

操做的目的是計算的

16.三、關係仿函數

操做的目的是比較的

16.四、邏輯仿函數

操做的目的是邏輯操做的

1七、多線程編程

 

1八、數組內存大小

int a[] = {1,2,3,4,5,6};

sizeof(a)= 6*4;  //數組總大小

sizeof(a[0])=4;  //int的大小

int* p = &a;

sizeof(p)=4或8; //指針的大小

&a 和 a 都是指數組的首地址

但因爲數據類型不同,&a是數組,a是數組首元素。 &a + 1 爲偏移整個數組,由於&a表示的是數組,+1指偏移數組的大小;  a+1 爲偏移一個元素

相關文章
相關標籤/搜索