码迷,mamicode.com
首页 > 编程语言 > 详细

c++ primer plus学习笔记(栈指针)

时间:2015-06-14 20:00:37      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

c++ primer plus

  • 程序清单14.5
  • 程序清单14.6
模拟如下情况:
某人将一车文件交给plodson,如果plodson的收取蓝是空的,他将取出车中最上面的文件,将它放入收    
取蓝,如果收取蓝是满的,他将取出栏中最上面的文件,并进行处理,然后放入发出蓝,如果收取蓝不空不满
plodson将采用抛硬币的方式来决定采取措施。
  • 很明显,我们需要使用栈去管理上述文件.
 1 #ifndef STACK_H_
 2 #define STACK_H_
 3 
 4 //定义类模板
 5 template 
 6 class Stack
 7 {
 8 private:
 9     enum{SIZE=10};
10     int stacksize;
11     //新增的成员
12     Type* items;
13     int top;
14 public:
15     //explicit构造函数是用来防止隐式转换的
16     explicit Stack(int ss=SIZE);
17     Stack(const Stack& st);
18     ~Stack(){delete [] items;}  
19     bool isempty() {return top==0;}
20     bool isfull() {return top==stacksize;}
21     bool push(const Type& item);
22     bool pop(Type& item);
23     //重载赋值运算符_返回对象的引用
24     Stack & operator=(const Stack& st);
25 };
26 template < typename Type>
27 Stack< Type>::Stack(int ss):stacksize(ss),top(0)
28 {
29     items=new Type[stacksize];
30 };
31 template < typename Type >
32 Stack< Type>::Stack(const Stack& st)
33 {
34     stacksize=st.stacksize;
35     top=st.top;
36     //重要代码
37     items = new Type [stacksize];
38     for(int i=0;i< typename Type>
39 bool Stack< Type>::push(const Type& item)
40 {
41     if(top< typename Type>
42 bool Stack< Type>::pop(Type& item)
43 {
44     if(top>0)
45     {
46         item = items[--top];
47         return true;
48     }
49     else
50     return false;
51 }
52 
53 template< typename Type>
54 Stack< Type>& Stack< Type>::operator =(const Stack< Type>& st)
55 {
56     if(this==&st)
57         return *this;
58     delete [] items;
59     stacksize=st.stacksize;
60     top=st.top;
61     items=new Type [stacksize];
62     for(int i=0;i< top;i++)
63     {
64         items[i]=st.items[i];
65     }
66     return *this;
67 }
68 #endif

说明:

问题一:

    explicit只对构造函数起作用是用来防止隐式转换的,这里引用(博客园中总结好的笔记  

     按照默认规定,带有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示

1 class String {
2 String ( const char* p ); // 用C风格的字符串p作为初始化值
3 //
4 }
5 String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);

但是有的时候可能会不需要这种隐式转换,如下:

 1 如下代码:
 2 class String {
 3        String ( int n ); //本意是预先分配n个字节给字符串
 4 String ( const char* p ); // 用C风格的字符串p作为初始化值
 5 //
 6 }
 7 
 8 下面两种写法比较正常:
 9 String s2 ( 10 );   //OK 分配10个字节的空字符串
10 String s3 = String ( 10 ); //OK 分配10个字节的空字符串
11 
12 
13 下面两种写法就比较疑惑了: String s4 = 10; //编译通过,也是分配10个字节的空字符串
14 String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串

s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。 为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字:

 1 class String {
 2        explicit String ( int n ); //本意是预先分配n个字节给字符串
 3 String ( const char* p ); // 用C风格的字符串p作为初始化值
 4 //
 5 }
 6 加上explicit,就抑制了String ( int n )的隐式转换,
 7  
 8 下面两种写法仍然正确:
 9 String s2 ( 10 );   //OK 分配10个字节的空字符串
10 String s3 = String ( 10 ); //OK 分配10个字节的空字符串
11  
12 下面两种写法就不允许了:
13 String s4 = 10; //编译不通过,不允许隐式的转换
14 String s5 = ‘a’; //编译不通过,不允许隐式的转换

问题二:

 1 重载赋值运算符函数原型如下: 
 2 Stack & operator=(const Stack& st);
 3 重载赋值运算符函数实现如下:
 4 template< typename Type>
 5 Stack< Type>& Stack< Type>::operator =(const Stack< Type>& st)
 6 {
 7     //判断
 8     if(this==&st)
 9         return *this;
10     //清楚内存区域
11     delete [] items;
12     stacksize=st.stacksize;
13     top=st.top;
14     items=new Type [stacksize];
15     for(int i=0;i< top;i++)
16     {
17         items[i]=st.items[i];
18     }
19     return *this;
20 }
21 类型为什么不同?
  • 前者是后者的缩写,但是,原则:只能在类中使用(即模板声明和模板函数中定义内使用)在类的外面,即指定返回类型或使用作用域解析符时,必须使用完整的stack< Type >

主函数

 1 #include< iostream>
 2 //随机数的处理
 3 #include< stdlib.h>
 4 #include< time.h>
 5 #include"stack.h"
 6 
 7 
 8 const int NUM=10;
 9 
10 int main()
11 {
12     //随机数
13     srand(time(0));
14     std::cout<< "请输入篮子的大小: ";
15     int stacksize;
16     std::cin>>stacksize;
17     //使用构造函数进行初始化,
18     //实例化模板
19     Stack< const char*> st(stacksize);
20     
21     //文件车
22     //指针数组的初始化
23     const char * in[NUM]={
24         "1:ru pengkun","2:haung weijun",
25         "3:liu xinxiang","4:yang dongpeng",
26         "5:mule","6:liudanqing",
27         "7:du zhuoheng","8:wang mingqin",
28         "9:shang yanan","10:ru jie"
29     };
30     
31     //发出篮
32     const char* out[NUM];
33     int processed=0;//#include
34 //随机数的处理
35 #include
36 #include
37 #include"stack.h"
38 
39 
40 //限定收取篮和发出篮的大小
41 const int NUM=10;
42 
43 int main()
44 {
45     //随机数
46     srand(time(0));
47     std::cout<<"请输入篮子的大小: ";
48     int stacksize;
49     std::cin>>stacksize;
50     //使用构造函数进行初始化,
51     //实例化模板
52     Stack st(stacksize);
53 
54     //初始化数组
55     //确保常量不被修改
56     //记住指针数组的初始化方法
57     const char * in[NUM]={
58         "1:ru pengkun","2:haung weijun",
59         "3:liu xinxiang","4:yang dongpeng",
60         "5:mule","6:liudanqing",
61         "7:du zhuoheng","8:wang mingqin",
62         "9:shang yanan","10:ru jie"
63     };
64     
65     //发出篮
66     const char* out[NUM];
67     int processed=0;//用来记录发出篮的文件数量
68     int nextin=0;//索引文件车的文件
69     while(processed < NUM)//如果发出篮的文件数小于发出篮的容量,就会继续循环
70     {
71         if(st.isempty())//取出篮为空
72             st.push(in[nextin++]);
73       //从文件车拿取索引号为0的文件存入取出篮,索引号+1;
74         else if(st.isfull())//取出篮已满
75             st.pop(out[processed++]);
76       //对取出篮(栈)执行出栈操作,并存入发出篮,用来记录发出篮的文件数量的变量+1;  
77         else if(rand()%2 && nextin< NUM)
78             st.push(in[nextin++]);
79         else
80               st.pop(out[processed++]);
81     }
82     for(int i=0;i< NUM;i++)
83     {
84         std::cout << out[i] << std::endl;
85     }
86 
87     return 0;
88 }

注意深拷贝和重载赋值符概念

 





c++ primer plus学习笔记(栈指针)

标签:

原文地址:http://www.cnblogs.com/rupengkun/p/4575544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!