• C++学习记录(八)纯虚函数、虚析构、模板函数、模板类、栈模板


    这是第八天的学习记录。

     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 }
  • 相关阅读:
    java中栈内存和堆内存的简单理解
    java中构造函数与一般函数的区别

    另一部漫画
    海边的卡夫卡
    11-12
    这篇大概值一百万吧
    我的千岁寒
    11-9
    嗯……………股票已经涨的我不想上班了
  • 原文地址:https://www.cnblogs.com/heze/p/16264380.html
Copyright © 2020-2023  润新知