c++ - 异常 C++,我只是不明白为什么输出是这样的

标签 c++ arrays oop exception

#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;
}

好的,所以输出是这样的:

a[0]=1

a[1]=1

异常数组

异常数组

a[2]=2

结束。

让我困惑的是程序返回的原因 a[2] 作为值 2?有人可以一步一步地详细说明这是如何实现的。我想我不太了解 C++ 中的异常。

最佳答案

 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,如前一条语句中所分配的那样。

关于c++ - 异常 C++,我只是不明白为什么输出是这样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466007/

相关文章:

c++ - 使用不同的变量名称在 ROOT 中绘制直方图

java - 复制对象数组,然后修改原始对象而不影响副本

javascript - 所有类中的单例模式

c++ - 为什么 Boost 参数选择继承而不是组合?

c++ - 常量变量在 header 中不起作用

c++ - C++中的指针与变速

c++ - 在 C++ 类对象中初始化指向父类的静态指针

c# - 无法在 C# 中初始化列表集合?

java 用户定义的数组(和用户定义的数组大小)返回 [null, null, null, ...]

Java:相同的对象,如何避免重复的代码