c++对象的调用

来源:百度知道 编辑:UC知道 时间:2024/06/25 17:40:15
#include<iostream.h>
int x=2,y=x+30;
class A
{
int y;
static int x;
public:
operator int()
{return x+y;}
A operator ++(int)
{return A(x++,y++);}
A(int x=2,int y=3)
{A::x=::x+x;A::y=::y+y;}
void print()
{cout<<x<<'\t'<<y<<endl;}
};
int A::x=23;
void main()
{
A a(54,3),b(65),c;
a.print();
int i=a+b;cout<<i<<endl;
c++;
c.print();

}结果是4 35
78
6 36共三行。
问题来了b(65)如何调用 ?还有是不是先调用a(54,3),b(65),c,调用完了后再执行a.print()的呢?
还有请高手详细分析调用过程以及如何产生的结果!越详细越好

先回答你的问题,第一个是b(65)调用问题,A的构造函数有默认值,所以应该按顺序赋值,即把65的值传递给第一个参数;第二个问题:先调用a,b,c,后执行a。print();
这个程序主要是注意区分静态数据成员,全局变量和函数的参数。其中,静态变量是和类的定义一同产生并且在产生的同时已经分配了内存,这就是说它和类的对象无关,即无论是否定义了类的对象系统都会为其分配内存并进行赋值等运算。所以我们为了清楚程序的运行过程,把类的静态数据成员x记为Ax,全局变量为Gx和Gy,函数的参数记为Fx和Fy。
下面分析程序:
类的定义中operator int(){return x+y;}可理解为+的重载,A operator ++(int){return A(x++,y++);}是++的重载,
A(int x=2,inty=3){A::x=::x+x;A::y=::y+y;}是类的构造函数。根据main函数之前的代码,我们可以知道,Ax=23,Gx=2,Gy=32.当执行A a(54,3)时,Ax=Gx+Fx=2+54=56,但执行到A b(65)时,Ax=Gx+Fx=2+65=66,同理可知,执行完第一条语句时,Ax=Gx+默认的Fx=2+2=4,Ay的值同理=Gy+Fy=32+3;所以输出a的时候是输出的4 35.并且现在a==b==c==(4,35),因此输出的i的值是4+35+4+35=78;根据以上分析就很容易得到程序的结果了。

其实,像这类分析题都可以加打印来分析,清楚地知道其运往机制,例如:
在 class A 的构造函数中增加一行:

A( int x=2,int y=3)
{ A::x = ::x + x; A::y=::y+y;
cout << this << '\t' << x << '\t' << y << endl;
}
你就清楚地知道调用顺序了,试试看!