虛函數
多態性是面嚮對象語言的基本特徵,多態性可以簡單地概括爲“一個接口,多種方法”。多態性分爲靜態多態性(編譯過程中綁定)和動態多態性。
函數重載(和運算符重載)屬於靜態多態性,一個函數名(調用接口)對應着幾個不同的函數原型(方法)。
虛函數屬於動態多態性,對比如下:
通過對象名訪問虛函數時,調用哪個類的函數取決於定義對象名的類型(對象類型是基類時,就調用基類的函數;對象類型是子類時,就調用子類的函數)。
使用指針訪問非虛函數時,編譯器根據指針本身的類型決定要調用哪個函數(而非根據指針指向的對象類型)。
使用指針(或引用)訪問虛函數時,編譯器根據指針所指對象的類型決定調用哪個函數(而與指針本身的類型無關)。
指針數組與數組指針
指針數組:裝着指針的數組。int *a[10]
數組指針:指向數組的指針。int (*p)[10]
不同類型數據的佔用空間大小
unsigned long long最大值ULLINT_MAX=0xffffffffffffffff(~18*10^18);
int最大值INT_MAX=0x7fffffff(~2*10^8)
標準模板庫STL的常用容器
順序容器:vector, deque, list
關聯容器:set, multiset, map, multimap
寫個multiset實現最小堆的例子:
#include <vector>
#include <set>
#include <iostream>
using namespace std;
struct Custom {
int a;
char b;
};
int main() {
vector<Custom> v{ Custom{ 1, 'a' } ,Custom{ 3, 'c' }, Custom{ 4, 'd' } ,Custom{ 2, 'b' } };
auto cmp = [](Custom left, Custom right) { return left.a < right.a; };
multiset<Custom, decltype(cmp)> customSet(cmp);
customSet.insert(v.begin(), v.end());
multiset<Custom, decltype(cmp)>::iterator customIterator;
while(!customSet.empty()) {
customIterator = customSet.begin();
cout << (*customIterator).a << (*customIterator).b << " ";
customSet.erase(customIterator);
}
return 0;
}
容器適配器: stack, queue, priority_queue 。都有3個成員函數:push()、top()、pop()。
排序算法sort
需要隨機訪問迭代器(vector、deque)的支持。
寫個sort和lambda結合排序的例子:
#include <vector>
#include <iostream>
#include<algorithm>
using namespace std;
struct Custom {
int a;
char b;
};
int main() {
vector<Custom> v{ Custom{ 1, 'a' } ,Custom{ 3, 'c' }, Custom{ 4, 'd' } ,Custom{ 2, 'b' } };
auto cmp = [](Custom left, Custom right) { return left.a < right.a; };
sort(v.begin(), v.end(), cmp);
for (Custom& e : v) {
cout << e.a << e.b << " ";
}
return 0;
}
輸出:1a 2b 3c 4d