鱼C论坛

 找回密码
 立即注册
查看: 2550|回复: 0

[技术交流] C++上天之路第43课到46课(函数模板)

[复制链接]
发表于 2017-7-18 11:54:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第四十三课到四十六课(函数模板)
        template<class T>
        void swap(T &a, T &b)
        {
           T tem = a;
           a = b;
           b = tem;
        }

        注:
            1.函数模板的原型和实现要在一起,不然会出错
            2.template<class T>class不代表一个类,而是一个类型,一可以换位typename
            3.swap<int>(i1,i2)可以明确告诉编译器使用什么类型

        类模板:
        template<class T>
        class Stack
        {
        public:
           Stack(xxx);
           push(T value);
           T pop();
           ~Stack();

        protected:
           T *data;
           unsigned int size;
           unsigned int sp;
        };

        写类模板内的函数时候要Stack<T>::Stack(xxx)加上<type>
        调用时候也要加上Stack<T> xxx;


函数模板:
  1. #include<iostream>
  2. #include<string>

  3. template<typename T>
  4. void swap(T &a,T &b)
  5. {
  6.         T temp = a;
  7.         a = b;
  8.         b = temp;
  9. }

  10. void main()
  11. {
  12.         int a = 1;
  13.         int b = 2;
  14.         std::cout << "a = " << a << ",b = " << b << "\n\n";
  15.         swap<int>(a,b);
  16.         std::cout << "a = " << a << ",b = " << b << "\n\n";

  17.         std::string s1 = "小乌龟";
  18.         std::string s2 = "鸹貔乌龟";
  19.         std::cout << "s1 = " << s1 << ",s2 = " << s2 << "\n\n";
  20.         swap<std::string>(s1,s2);
  21.         std::cout << "s1 = " << s1 << ",s2 = " << s2 << "\n\n";
  22. }
复制代码


类模板:
  1. #include<iostream>
  2. #include<string>

  3. template<class T>
  4. class Stack
  5. {
  6. public:
  7.                 Stack(unsigned int size = 100)
  8.                 {
  9.                         this->size = size;
  10.                         data = new T[size];
  11.                         sp = 0;
  12.                 }
  13.                        
  14.                 Stack(Stack &rhs)
  15.                 {
  16.                         *this = rhs;
  17.                 }

  18.                 Stack &operator= (Stack &rhs)
  19.                 {
  20.                         if(this != &rhs)
  21.                         {
  22.                                 this->data = new T[size];
  23.                                 unsigned temsp = rhs.sp;        //保存rhs的栈指针sp
  24.                                 while(rhs.sp > 0)
  25.                                 {
  26.                                         //temsp--;
  27.                                         data[rhs.sp] = rhs.pop();
  28.                                 }
  29.                                 this->sp = temsp;
  30.                                 this->size = rhs.size;
  31.                                 rhs.sp = temsp;
  32.                         }
  33.                         else
  34.                         {
  35.                                 std::cout << "相同的两个类\n";
  36.                         }
  37.                         return *this;
  38.                 }
  39.                
  40.                 ~Stack()
  41.                 {
  42.                         delete []data;
  43.                 }

  44.                 void push(T value) throw(const char *)
  45.                 {
  46.                         if(sp == size)
  47.                                 throw "栈满!";
  48.                         data[sp++] = value;
  49.                 }

  50.                 T pop() throw (const char *)
  51.                 {
  52.                         if(sp == 0)
  53.                                 throw "栈空!";
  54.                         return data[--sp];
  55.                 }

  56. protected:
  57.         unsigned int size;
  58.         unsigned int sp;
  59.         T *data;
  60. };

  61. void main()
  62. {
  63.         Stack<int> stack;
  64.         try
  65.         {
  66.                 stack.push(1);
  67.                 stack.push(2);
  68.                 stack.push(3);
  69.        
  70.         //        std::cout << stack.pop() << "\n";
  71.         //        std::cout << stack.pop() << "\n";
  72.         //        std::cout << stack.pop() << "\n";
  73.         //        std::cout << stack.pop() << "\n";
  74.         }
  75.         catch(char *a)
  76.         {
  77.                 std::cout << a << "\n";
  78.         }


  79.         Stack<int> stack2 = stack;
  80.         std::cout << stack2.pop() << "\n";
  81.        
  82. }
复制代码

评分

参与人数 1鱼币 +1 收起 理由
小甲鱼 + 1

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 14:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表