为什么静态初始化和构造函数行为在此程序中有所不同。

时间:2013-09-20 09:48:50

标签: c++

当我使用构造函数defination运行下面的程序时,在执行最后一个pop函数后输出为-1。

#define SIZE 100
class stack
{
private:
    int tos;
    int arr[SIZE];
public:
    stack(){tos=0;}
    int push(int);
    int pop();
};

int stack::push(int i)
{
    if(tos==SIZE)
        {cout<<"stack is full\n";}
        arr[tos]=i;
        tos++;
        return 0;
}
int stack::pop ()
{
    if(tos==0)
        {cout<<"stack is empty\n";}
        tos--;
        return arr[tos];
}

int main()
{
    stack stack1;
    stack1.push(1);
    stack1.push(2);
    stack1.push(3);
    cout<<stack1.pop();
    cout<<stack1.pop();
    cout<<stack1.pop();
    cout<<stack1.pop();
    return 0;
}

但是当我尝试使用静态初始化运行时,相同的程序会给出垃圾值。

#define SIZE 100
class stack
{
    private:
        static int tos;
        int arr[SIZE];
    public:
        int push(int);
        int pop();
};

int stack :: tos = 0;
int stack::push(int i)
{
    if(tos==SIZE)
    {cout<<"stack is full\n";}
    arr[tos]=i;
    tos++;
    return 0;
}
int stack::pop ()
{
    if(tos==0)
    {cout<<"stack is empty\n";}
    tos--;
    return arr[tos];
}

int main()
{
    stack stack1;
    stack1.push(1);
    stack1.push(2);
    stack1.push(3);
    cout<<stack1.pop();
    cout<<stack1.pop();
    cout<<stack1.pop();
    cout<<stack1.pop();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这是因为未定义的行为。当你按或弹出时,你检查它是否正常,但是继续操作,即使它不是。

因此,当您按三次,然后弹出四次时,您将使用pop函数中的负索引索引数组。

答案 1 :(得分:1)

你们两个程序都有同样的错误:

int stack::pop ()
{
    if(tos==0)
    {cout<<"stack is empty\n";}
    tos--;
    return arr[tos];
}

你试图让一个元素超出数组范围。这会导致未定义的行为。 push函数中的相同内容。

答案 2 :(得分:0)

推送和弹出功能应更改为,

    #define SUCCESS 0
    #define FAILURE 1

    stack::stack(){tos=-1;}

    int stack::push(int i)
    {
        if(tos==SIZE)
        {
          cout<<"stack is full\n";
          return FAILURE;
        }
        else {
           arr[++tos]=i;
        }
        return SUCCESS;
    }

    int stack::pop ()
    {
       if(tos==-1)
       {
          cout<<"stack is empty\n";
          throw "Stack is Empty"; //Throw the exception, handle the exception in main
       }
       else 
       {
          return arr[tos--];
       }
    }