1. 程式人生 > 其它 >C++學習記錄(8)純虛擬函式、虛析構、模板函式、模板類、棧模板

C++學習記錄(8)純虛擬函式、虛析構、模板函式、模板類、棧模板

這是第八天的學習記錄。

 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 }