c++;程序 当我试图提高我的C++知识时,我从一个旧的编程竞赛中发现了这个问题。今年我会努力参加比赛,所以我想做好准备

c++;程序 当我试图提高我的C++知识时,我从一个旧的编程竞赛中发现了这个问题。今年我会努力参加比赛,所以我想做好准备,c++,prefix,operator-precedence,postfix-notation,C++,Prefix,Operator Precedence,Postfix Notation,以下程序的输出是什么 #include <iostream> using namespace std; int dat=1; int counter=0; class ClassB; class B { public: virtual void f(int d=5)=0; }; class A { unsigned i; public: int pod; int index;

以下程序的输出是什么

#include <iostream>

using namespace std;

int dat=1;
int counter=0;

class ClassB;

class B {

  public: 
          virtual void f(int d=5)=0;
          };

class A {

  unsigned i;
  public:
         int pod;
         int index;


         A& operator++() { cout<<"A "<<pod--<<dat++<<endl; A* b=new A;  return *b; }
         A operator++(int) {cout<<"B "<<pod++<<dat--<<endl; A* b=new A;  return *b;}
         A& operator--() {cout<<"C "<<dat++ <<++pod<<endl; A* b=new A;  return *b;}
         A operator--(int) {cout<<"D "<<dat--<<--pod<<endl; A* b=new A;  return *b;}
         void operator+(A& b) {cout<<"Addition Index "<<index<<endl; pod++;}

         friend void B::f(int);
         A() : i(0), pod(dat) {pod++; index=++counter; cout<<"CA "<<"Index "<<index<<endl; }
         ~A(){pod++; cout<<"DA Index "<<index<<endl;}

};              


 const ClassB& returnClassA(const ClassB& p) {return p;}


class ClassB: public A, public B {
    public:
         void f(int d=2){A c; c++; pod*=d--;}
         ClassB(){cout<<"CB Index "<<index<<endl;}
         ~ClassB(){cout<<"DB Index "<<index<<endl;}
};


ClassB returnClassB(ClassB s) {return s;}

class ClassC : public ClassB {
  public:
         ClassC(){cout<<"CC Index "<<index<<endl;}
         ~ClassC(){cout<<"DC Index "<<index<<endl;}
};

ClassB returnClassC(ClassB s){return s;}

int main()
{           
    ClassC x;      
    A v,w;               
    B *c = new ClassB;   

   --++v--+++w;

   returnClassC(returnClassB(returnClassA(x))); 

   return 0;

}   
产出:

  • CA索引1
  • CB指数1
  • CC索引1
  • CA指数2
  • CA指数3
  • CA指数4
  • CB指数4
  • 我明白

    我无法理解下一个表达式,-++v--++w;所以首先我试着理解--++v--++;然后我会加上+w

    -->+v-->+的输出;是:

  • D 11
  • CA指数5
  • B 10
  • CA索引6
  • A 0-1
  • CA索引7
  • C02
  • CA索引8
  • DA索引6
  • DA索引5
  • 这意味着操作的顺序是--(++((v--)++)。 为什么会这样?关于哪些操作首先被评估,是否有一些规则? 我也不明白为什么要调用索引为6和5的对象的析构函数

    如果我使用原始表达式,-++v--++w, 输出为:

  • D 11
  • CA指数5
  • B 10
  • CA索引6
  • A 0-1
  • CA索引7
  • C02
  • CA索引8
  • 添加索引8
  • DA索引6
  • DA索引5
  • 为什么最后评估+w操作?是因为运算符的优先级吗? 另外,我发现如果我写了一些东西要注意 当你在C++中重载运算符时,有一些事情需要知道,例如++你可以做一个预增量< /p>
    ++i
    
    i++
    
    或者是一个岗位增量

    i++
    
    为了告诉编译器您正在重载哪个,您需要在签名中没有参数或int

    A operator++(int) 
    
    正在重载后增量

    A& operator++() 
    
    重载预增量

    i++
    
    <>在C++中,一个对象的下拉符被称为两种情况

  • 在指向使用new分配的对象的指针上调用delete

    A* = new A(); //constructor is called
    delete(A);//destructor is called
    
  • 为在堆栈上创建的对象保留上下文

    if(something) {
        A a();
        ...
    } //here a's destructor is called because a no longer exists
    
  • 请注意,在代码中,有些运算符返回副本,有些运算符返回引用

    A operator++(int) 
    
    此函数将返回一个副本。这意味着,当您调用此特定函数时,将在正在调用的新A的函数内调用构造函数一次,然后在您从函数返回时再次调用构造函数,因为正在复制b指向的对象的副本

    您可以在这里找到有关运算符优先级的一些信息()


    我注意到有些人告诉你,从这样的代码中学习是没有用的。我同意这样的编码是很糟糕的,但是它可以教你很多关于构造函数/析构函数、堆/栈和操作符在C++中如何工作的方法。也许有更好的学习方法,这对我来说是相当“期中考试”