C++學習記錄(8)純虛擬函式、虛析構、模板函式、模板類、棧模板
阿新 • • 發佈:2022-05-12
這是第八天的學習記錄。
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 A() { cout << "A" << endl; } 9 A(const A& a) { cout << "copy A" << endl; } 10 //virtual ~A() { cout << "~A" << endl; } 11 ~A() { cout << "~A" << endl; } 12 13 //virtual void show() = 0; 14 //virtual void showInfo() { cout << "A info" << endl; } 15 void showInfo() { cout << "A info" << endl; } 16 }; 17 class B : public A 18 { 19 int *p; 20 public: 21 B() 22 { 23 p = new int[1024];24 cout << "B" << endl; 25 } 26 ~B() 27 { 28 delete []p; 29 cout << "~B" << endl; 30 } 31 32 //void show() override { cout << "hello" << endl; } 33 //void showInfo() override { cout << "B info" << endl; } 34 };35 36 int main() 37 { 38 // -1- 純虛擬函式,沒有函式體的虛擬函式,含有純虛擬函式的類叫抽象類 39 // 主要用做基類使用virtual 返回值 函式名(形參) = 0; 40 // 這種抽象類不可以產生物件,但是可以定義指標,子類可對其定義 41 //A* a = new B; 42 //a->show(); 43 44 // -2- 虛析構,在基類的虛構函式前叫virtual 45 // 子類析構時,會自動呼叫基類中的析構 46 // 主要用於多型發生時,無法呼叫子類析構而出現的記憶體洩露 47 //a->showInfo(); 48 //delete a; 49 50 // -3- 子類的初始化列表 51 // 子類初始化列表不可以對父類初始化 52 53 // -4- 拷貝構造和虛指標 54 // 兩個不同類之間的賦值,會發生拷貝建構函式 55 56 // -5- 臨時物件,兩個物件不會指向同一個空間 57 //A a1 = B(); // a1通過A的拷貝構造產生,B()為臨時構造,生命週期為本行 58 //const A& a2 = B(); 59 60 // -6- 常引用 61 62 // -7- 右值引用 63 // 臨時物件又叫右值 64 A&& a3 = B(); 65 a3.showInfo(); 66 67 //cout << "Hello World!" << endl; 68 return 0; 69 }
1 #include <iostream> 2 3 using namespace std; 4 5 // 範型函式模板 6 template<class T> 7 T Add(T t1, T t2) 8 { 9 return t1 + t2; 10 }; 11 // 特化函式模板,一般不進行特化 12 template<class T> 13 T Add(int t1, int t2) 14 { 15 return t1 + t2; 16 }; 17 18 // 類模板 19 template<class A, class B, class C> 20 class Base 21 { 22 A a; 23 B b; 24 C c; 25 public: 26 void show(A a, B b) { cout << "show" << endl;} 27 }; 28 template<class A, class B, class C, class D> 29 class Son : public Base<A, B, C> // 模板寫類的繼承 30 { 31 public: 32 void showInfo(A a, D d) { cout << "show Son" << endl; } 33 }; 34 35 int main() 36 { 37 // -1- 函式模板,類模板 38 cout << Add<int>(2,3) << endl; 39 cout << Add<float>(4,5) << endl; 40 cout << Add(6,7) << endl; // 不推薦使用這種 41 42 // -2- 呼叫類模板去定義物件是,一定要顯示指定具體值 43 Base<int,float,string> a; 44 a.show(1, 2.1); 45 46 Son<int,float,string,double> b; 47 b.showInfo(2,3.2); 48 49 cout << "Hello World!" << endl; 50 return 0; 51 }
1 #ifndef MY_STACK_H 2 #define MY_STACK_H 3 4 #include <iostream> 5 using namespace std; 6 7 template<class T> 8 class My_stack 9 { 10 private: 11 int capacity; 12 int size; 13 T* data; 14 public: 15 My_stack(int c = 10); 16 ~My_stack(); 17 18 bool push(T t); 19 bool pop(); 20 T top(); 21 bool empty(); 22 23 }; 24 25 template<class T> 26 My_stack<T>::My_stack(int c):size(0),capacity(c) 27 { 28 data = new T[c]; 29 } 30 31 template<class T> 32 My_stack<T>::~My_stack() 33 { 34 delete []data; 35 } 36 37 template<class T> 38 bool My_stack<T>::push(T t) 39 { 40 if (size > capacity) { return false;} 41 data[size] = t; 42 size++; 43 return true; 44 } 45 46 template<class T> 47 bool My_stack<T>::pop() 48 { 49 if (size == 0) { return false; } 50 size--; 51 } 52 53 template<class T> 54 T My_stack<T>::top() 55 { 56 if (size > 0) 57 { 58 T temp = data[size - 1]; 59 return temp; 60 } 61 } 62 63 template<class T> 64 bool My_stack<T>::empty() 65 { 66 if (size == 0) { return true; } 67 return false; 68 } 69 70 #endif // MY_STACK_H
1 #include <iostream> 2 #include "my_stack.h" 3 using namespace std; 4 5 int main() 6 { 7 My_stack<int> stack; 8 stack.push(1); 9 stack.push(2); 10 stack.push(3); 11 // 先入後出 12 for (int i = 0; !stack.empty(); i++) 13 { 14 cout << stack.top() << endl; 15 stack.pop(); 16 } 17 //cout << "Hello World!" << endl; 18 return 0; 19 }