// 第二十四章 异常和错误处理
//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;
}