一、創建引用的時候,必須初始化,引用一旦初始化,就和一個對象綁定,不能再修改成其餘對象的引用算法
二、對引用取地址,和對原始對象取地址,是同一個地址編程
三、不能用作引用的: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 int *p; // 指的是 *p 不能修改
int* const p; // 指的是p不能修改
推薦傳遞const引用,而不是傳遞對象,效率更高。
友元關係不對稱、不傳遞
A聲明瞭B是友元,那麼B久能夠訪問A的private和protect成員,B能夠是方法或者類。
不能重載的運算符: :: .* . ?:
可使用友元函數或成員函數實現運算符重載,友元函數須要多一個參數,不須要加類做用域。
必須做爲成員函數重載的運算符: = () [] ->
前增量重載 A& operator++()
後增量重載 A operator++(int)
須要多態的函數須要聲明爲virtual
析構函數要申明爲virtual
Java的全部方法都是virtual的
SmartPtr是一個模板類
跟shared_ptr不同。
用策略模式替代菱形或其餘複雜的繼承
字符串: 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> 定義了一些模板類,用以申明函數對象
行爲是一個雙向數組
原理是一個多段數組
VS vector 優勢:雙向,插入塊;缺點:訪問慢
multiset能夠插入重複的值。
insert的返回結果是個pair,第一個是插入的迭代器位置,第二個是是否成功,若是是set插入重複的值,實際是插入失敗的。
重載了()操做符的函數
16.一、謂詞
返回值爲bool的仿函數
16.二、算數仿函數
操做的目的是計算的
16.三、關係仿函數
操做的目的是比較的
16.四、邏輯仿函數
操做的目的是邏輯操做的
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 爲偏移一個元素