C++中的析构函数!

来源:百度知道 编辑:UC知道 时间:2024/06/30 15:54:03
这是我编写的一段代码,为什么会出现如下的运行结果?
#include <iostream>
using namespace std;
static double pi=3.14;

class Point{
public:
Point(float xx=0,float yy=0);
Point(Point &);
~Point();
float GetX(){return X;}
float GetY(){return Y;}
void print();
private:
float X,Y;
};

Point::~Point(){
cout<<"析构函数被调用!"<<endl;
}

Point::Point(float xx,float yy){
X=xx;
Y=yy;
}

void Point::print(){
cout<<"("<<X<<","<<Y<<")"<<endl;
}

Point::Point(Point &c){
X=c.X;
Y=c.Y;
}

class Circle{
public:
Circle(Point c,float r);
Circle(Circle &);
~Circle();
void getCenter();
float getRadius();
float Circumference();
float Area();
private:
Point center;
float radius;
};

Circ

这个是这样的:

开头的“析构函数被调用!”这句话是Point类的析构函数输出的。
为什么会被析构呢?

在第二句:
Circle AA(A,5);
中,你把一个Point类型的A按值传递给了Circle的构造函数。
按值传递就是拷贝。
C++在Circle的构造函数中新建一个Point类对象,然后把A的值拷贝到这个对象中,然后构造函数结束,由于这个新建的对象是局部变量,因此被清除,于是Point类的析构函数就被调用了。

你可以试试看把Circle::Circle(Point c,float r) 这个构造函数改一下,把Point c改为Point& c,这样按引用传递,不会在局部创建新对象,当然也就不会析构,就不会在开头输出那句话了。

楼上的正解,没法补充了!
如果对于“传值”、“传址”、“传引用”还不明白的,建议好好温习一下吧!C++中会经常碰到这些问题的!