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;
}
产出:
++i
i++
或者是一个岗位增量
i++
为了告诉编译器您正在重载哪个,您需要在签名中没有参数或int
A operator++(int)
正在重载后增量
A& operator++()
重载预增量
i++
<>在C++中,一个对象的下拉符被称为两种情况
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++中如何工作的方法。也许有更好的学习方法,这对我来说是相当“期中考试”我真的不认为破解这样愚蠢的代码是最好的方式来提高C++知识,不要浪费你的时间在***这样。@尼古拉-如果它是很难说什么代码,这只是没有用。你永远不会写这样的东西。我们的目标是编写显然工作正常的代码,而不是编写任何人都无法理解的代码。:-)@我在OOP竞赛中发现了这个问题。这个比赛很受欢迎,也很受认可,我不知道他们为什么会提出这样的问题。谢谢你的回复。我理解增量后/增量前的概念,也理解代码。我不明白的是,正如我说的,当我们有像--++v--++w这样的表达式时,它们被调用的顺序。哪个先来,为什么?我发送的链接告诉你哪些操作符从右向左,哪些是从左向右。哦,我现在明白了,我不明白从右向左和从右向左是什么意思,谢谢。无法投票,新成员。如果您发现它回答了您的问题,则您始终可以接受;)我仍然需要理解returnClassC(returnClassB(returnClassA(x));部分