对象和类的更多内容(二)
析构函数(destructure):如果程序员没有显式定义析构函数,那么编译器问为每个类定于一个默认的析构函数。名字与构造函数一样,前面有~

class Circle{ public: Circle(); Circle(double); ~Circle(); double getArea(); double getRadius(); void setRadius(double); static int getNumberOfObjects(); private: double radius; static int numberOfObjects; };

#include"Circle.h" #include<iostream> using namespace std; int Circle::numberOfObjects=0; Circle::Circle() { radius=1; numberOfObjects++; } Circle::Circle(double radius) { this->radius=radius; numberOfObjects++; } double Circle::getArea() { return radius*radius*3.141592653; } int Circle::getNumberOfObjects() { return numberOfObjects; } double Circle::getRadius() { return radius; } void Circle::setRadius(double radius) { this->radius=radius; } Circle::~Circle() { numberOfObjects--; };

#include"Circle.h" #include<iostream> using namespace std; int main() { Circle *pCircle1=new Circle(); Circle *pCircle2=new Circle(); Circle *pCircle3=new Circle(); cout<<Circle::getNumberOfObjects()<<endl; delete pCircle1; cout<<Circle::getNumberOfObjects()<<endl; return 0; }
拷贝构造函数(copy constructor):函数可以用来拷贝创建一个对象,并用另一个对象的数据初始化新建一个对象。
className(className &);

#include<iostream> #include"Circle.h" using namespace std; int main() { Circle circle1(5); Circle circle2(circle1); cout<<circle1.getRadius()<<" "<<circle1.getNumberOfObjects()<<endl; cout<<circle2.getRadius()<<" "<<circle2.getNumberOfObjects()<<endl; cout<<Circle::getNumberOfObjects()<<endl; circle2.setRadius(67); cout<<circle2.getRadius()<<" "<<circle2.getNumberOfObjects()<<endl; cout<<Circle::getNumberOfObjects()<<endl; return 0; }
拷贝函数也是一种构造函数。
默认的拷只运算符进行对象复制采用的是贝构造函数或赋值运算符进行对象复制采用的是一种所谓的“浅拷贝(shallow copy)”方式,而不是“深拷贝”方式,即如果数据域是一个指向其他对象的指针,那么简单地复制指针保存的地址值,二不是复制指向的对象的内容。
自定义拷贝函数:深拷贝

class Date{ public: Date(int year,int month,int day); ~Date(); int getYear(); int getMonth(); int getDay(); void setYear(int year); void setMonth(int month); void setDay(int day); private: int year; int month; int day; };

#include"Date.h" Date::Date(int year,int month,int day) { this->year=year; this->month=month; this->day=day; } void Date::setDay(int day) { this->day=day; } void Date::setMonth(int month) { this->month=month; } void Date::setYear(int year) { this->year=year; } int Date::getDay() { return day; } int Date::getMonth() { return month; } int Date::getYear() { return year; } Date::~Date() { };

#include"Date.h" class Person{ public: Person(int id,int year,int month,int day); Person(Person &); Person::~Person(); int getId(); Date* getBirthDate(); private: int id; Date *birthDate; };

#include"Person.h" Person::Person(int id,int year,int month,int day) { this->id=id; birthDate=new Date(year,month,day); } Person::Person(Person &person) { id=person.id; Date *p=person.getBirthDate(); birthDate=new Date(*p); } Person::~Person() { delete birthDate; } int Person::getId() { return id; } Date *Person::getBirthDate() { return birthDate; };

#include"Person.h" #include<iostream> using namespace std; void display(Person &person1,Person &person2) { cout<<person1.getId()<<endl; cout<<person1.getBirthDate()->getYear()<<" "; cout<<person1.getBirthDate()->getMonth()<<" "; cout<<person1.getBirthDate()->getDay()<<endl; cout<<person2.getId()<<endl; cout<<person2.getBirthDate()->getYear()<<" "; cout<<person2.getBirthDate()->getMonth()<<" "; cout<<person2.getBirthDate()->getDay()<<endl; } int main() { Person person1(111,1970,5,3); Person person2(person1); display(person1,person2); cout<<(person1.getBirthDate()==person2.getBirthDate())<<endl; person2.getBirthDate()->setYear(2000); display(person1,person2); Person person3(111,1970,5,3); Person person4=person3; cout<<(person3.getBirthDate()==person4.getBirthDate())<<endl; return 0; }