// 第二十四章 异常和错误处理 //1异常 /*#include <iostream> using namespace std; class wrong{}; void error() { cout<<"出错"<<endl; throw wrong(); } int main() { try{ error(); } catch(wrong) { cout<<"该错误已经解决"<<endl; } return 0; }*/ #include <iostream> using namespace std; const int num=5; class people { public: people(int size=num); people(const people&r); ~people(){delete []p; } people&operator=(const people&r); int &operator[](int off)const; int GetSize()const{ return size;} friend ostream&operator<<(ostream&, const people&); class wrong{}; private: int *p; int size; }; people::people(int Size):size(Size) { //初始化指针p p = new int[size]; for(int i=0; i<size; i++){ p[i] = 0; } } //赋值运算符 people&people::operator=(const people&r) { //如果自己与自己赋值那么直接返回自己 if(this == &r){ return *this; } //这里需要先清空p指针,p是一个指针数组 delete []p; int _size = r.GetSize(); p = new int[_size]; for(int i=0; i<_size; i++){ p[i] = r[i]; } return *this; } //复制构造函数 people::people(const people&r) { int _size = r.GetSize(); p = new int[_size]; for(int i=0; i<_size; i++){ p[i] = r[i]; } } //重新运算符[] int&people::operator[](int off)const { int _size = GetSize(); if(off >=0 && off < _size){//如果值在正常范围内 return p[off]; } throw wrong(); return p[0]; //返回 } //重新友元输出符 friend ostream&operator<<(ostream&, const people&) //友元函数的定义不用加类名也不用在前面加班friend ostream&operator<<(ostream& out, const people&r) { for(int i=0; i<r.GetSize(); i++){ out<<"p["<<i<<"]:"<<r[i]<<endl; } return out; } int main() { people one(20); try{ for(int i=0; i<100; i++){ one[i] = i; cout<<"one["<<i<<"]赋值完毕..."<<endl; } //下标运算符检查所传入的下标值,假如下标值超过数组所允许的范围,就抛出一个异常,异常类型为我们在第15行声明的wrong }catch(people::wrong) //因为wrong类是在people类里面声明的,所以前面需要加上people::wrong { cout<<"超过数组长度,不能继承执行赋值操作!"<<endl; } return 0; }