例外C ++,我只是不明白为什么输出就是这样

时间:2015-12-25 20:06:06

标签: c++ arrays oop exception exception-handling

#include <iostream>

 using namespace std;

class Array
{
    private:
      int* a;
      int n;
    public:
        Array(int n) : n(n) {a = new int[n];};
        ~Array(){delete a;};
        int& operator[](int i)
        {
            try
            {
                if ( i < 0 || i >= n) throw 1;
                return a[i];
            }
            catch(int i)
            {
                cout << "Exception Array" << endl;
                return a[0];
            } 
        };


};



int main()
{
    Array a(2);

    try
   {
      a[0] = 1;
      cout << "a[0]=" << a[0] << endl;
      a[1] = 1;
      cout << "a[1]=" << a[1] << endl;
      a[2] = 2;
      cout << "a[2]=" << a[2] << endl;
    }
catch(int i)
{
    cout << "Exception main " << endl;
}

cout << "End. " << endl;
}

好的,输出是这样的:

一个[0] = 1

一个[1] = 1

异常数组

异常数组

一个[2] = 2

结束。

令我困惑的是该程序返回的原因 a [2]为值2?有人可以一步一步地了解如何实现这一目标。我想我不了解C ++中的异常。

2 个答案:

答案 0 :(得分:3)

 a[2] = 2;

在这里,您使用超出范围的值调用operator[];它会打印Exception Array并返回对a.a[0]的引用。因此(忽略日志消息),此分配相当于a[0] = 2; - a.a[0]的值现在为2.

cout << "a[2]=" << a[2] << endl;

在这里,您再次使用相同的参数调用operator[];它再次输出异常消息并返回对a.a[0]的引用,其值仍为2,如前一个语句中所指定的那样。

答案 1 :(得分:0)

此代码

a[2] = 2;
cout << "a[2]=" << a[2] << endl;

尝试访问a[2]两次,一次在赋值中,一次在输出语句中。它们都超出了范围,因此有两个例外。