第二十四章 异常和错误处理 3异常的派生 简单

// 第二十四章 异常和错误处理 3异常的派生
#include <iostream>
using namespace std;
const int num=5; 
class people
{
public:
	people(int Size=num);
	~people(){ delete []p; };
	int&operator[](int off);
	const int&operator[](int off)const;
	//int GetSize(){ return size; }
	int GetSize()const{ return size;}

	class wrong{};
	class offset{};
	//class Big:public offset{};  
	//class Nav:public offset{}; 
	class Big{};
	class Nav{};
	class Small{};
	class Zero{};
private:
	int *p;
	int size;
};

people::people(int Size):size(Size)
{
	 cout<<"调用构造函数"<<endl;
	 if(Size == 0){
		 throw Zero();
	 }
	 if(Size < 10){
	     throw Small();
	 }
	 if(Size > 10000){
	     throw Big();
	 }
	 if(Size < 1){
	     throw Nav();
	 }
     p = new int[Size];
	 for(int i=0; i<Size; i++)
	 {
	     p[i] = 0;
	 }
}

int&people::operator[](int off)
{
	if(off>=0 && off < GetSize())
	{
	     return p[off];
	}
	throw wrong();
	return p[0];
}

//一样,只是该函数内的值是不可更改并且返回值也是不可更改的
const int&people::operator[](int off)const
{
	int Size = GetSize();
	//这里还是没有太消化得了,const int&people::operator[](int off)const
	//在该函数内为什么调用的GetSize()函数声明方式一定要是int GetSize()cosnt{ return size;}
	//如果是int GetSize(){ return size;}
	//error C2662: “people::GetSize”: 不能将“this”指针从“const people”转换为“people &”
	//从这句错误语句可以理解一点
	//本方法内用的people是用的const people,也就是对people只能可读操作
	//还是弄不太懂
  	if(off>=0 && off < GetSize())
	{
	     return p[off];
	}
	throw wrong();
	return p[0];    
}


int main()
{
	try{
	    people one(-2);
		for(int i=0; i<100; i++){
		    one[i] = i;
			cout<<"one["<<i<<"]赋值完毕....."<<endl;
		}	
	}catch(people::wrong){
	    cout<<"超过数组长度,不能继承执行赋值操作"<<endl;
	}
	catch(people::offset)
	{
	    cout<<"下标值过大或者为负数"<<endl;
	}
	catch(people::Big)
	{
	    cout<<"下标值过大"<<endl;
	}
	catch(people::Small){
	    cout<<"下标值过小"<<endl;
	}
	catch(people::Zero){
	    cout<<"下标值为0"<<endl;
	}
	catch(people::Nav){
	    cout<<"下标值为负数"<<endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2719202.html