注册 登录
编程论坛 C++教室

关于析构函数

cclearner 发布于 2007-06-28 23:22, 819 次点击

class Point
{
public:
Point(int xx=0, int yy=0) {X=xx; Y=yy; countP++; }
Point(Point &p);
~Point(){ countP--;}

int GetX() {return X;}
int GetY() {return Y;}
void GetC() {cout<<" Object id="<<countP<<endl;}
private:
int X,Y;
static int countP;
};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}

int Point::countP=0;
int main()
{
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetC();
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
B.GetC();
}
红色的一句是干什么的呢,为什么在此句中加上输出,会输出一个莫名其妙的countP

11 回复
#2
smithallen2007-06-29 10:12
~Point(){ countP--;}的作用是析够一个对象,对象的个数countP就会减一。

~Point(){ countP--;cout<<"Object number ="<<countP<<endl;}是正常的啊。
#3
aipb20072007-06-29 12:07
你写的吗?
因为countp是静态成员,所以独立于类存在。
它就是统计你当前类对象的个数。

明白了吗?所以析构就要减1!
#4
cclearner2007-06-29 22:48
不明白啊,为什么要减一呢,什么时候析构的,我怎么删掉这一句析构函数对结果没有任何影响啊?
#5
aipb20072007-06-29 23:58
比如这样:(main 函数里)
Point *A = new Point(4,5); //创建对象A
Point B(*A); //创建对象B
B.GetC();
delete A; //销毁A,调用析构函数
B.GetC();

你看下结果就明白了。
#6
zkkpkk2007-06-30 11:31
静态成员被分配到另外的一片静态存储区,不依赖对象的存在
#7
cclearner2007-06-30 12:04
我明白析构了要减一,可是为什么要认为设计这个减一呢,我看不用设计减一没有任何影响啊。这个程序不是我写的,所以才不明白为啥要罗索这一句。谢谢了!
#8
aipb20072007-06-30 12:25
你去运行了我的代码了吗?

运行了你就知道为什么要设计这个,你要清楚,那个countP是什么,有什么作用,你如果不去理解,就没办法了。
#9
cclearner2007-06-30 19:44
啊,非常感谢版主!我想可能是设计人员的思维比较全面吧,虽然对现有的一点没有影响,但如果A没有了,程序就必须要这样析构了,嗯,我的确要狠狠地提高一下了。
谢谢版主教育。
#10
aipb20072007-06-30 20:32
恩,继续加油吧!

GOOD LUCK
#11
zkkpkk2007-07-02 10:19
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}
这里已经说明countP的作用了呢,而且也可以顾名思义,“计算P”
#12
cclearner2007-07-02 22:09
偶,知道,countP,不知道--,现在知道了
1