析构函数
确保对象的各部分被正确的清除,及做一些用户指定的其他清理工作。
当对象超出它的作用域时,编译器将自动调用析构函数;手动用new在堆上分配的对象空间,需要调用'delete 对象地址'进行手动清除, delete 语句 先调用该对象的析构函数,然后释放内存
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 7 class Publisher 8 { 9 string name; 10 string address; 11 string telephone; 12 13 public: 14 15 Publisher(string name, string address, string telephone) : name(name), address(address), telephone(telephone) 16 { 17 cout << "Publisher(string name, string address, string telephone)" << endl; 18 } 19 20 ~Publisher() 21 { 22 cout << "~Publisher()" << endl; 23 } 24 25 friend ostream& operator<<(ostream& os, const Publisher& p) 26 { 27 return os << "PublisherName: " << p.name << ", PublisherAddress: " << p.address << ", Publishertelephone: " << p.telephone; 28 } 29 30 }; 31 32 33 class Book 34 { 35 string name; 36 string author; 37 double price; 38 Publisher* publisher; 39 40 public: 41 42 Book(string name, string author, double price, Publisher* pub) : name(name), author(author), price(price), publisher(pub) 43 { 44 cout << "Book(string name, string author, double price, Publisher publisher)" << endl; 45 } 46 47 ~Book() 48 { 49 cout << "~Book()" << endl; 50 if (publisher != 0) 51 { 52 delete publisher; 53 publisher = 0; 54 cout << "delete publisher" << endl; 55 } 56 57 } 58 59 friend ostream& operator<<(ostream& os, const Book& b) 60 { 61 os << "-------- print Book ---------------" << endl; 62 os << "BookName: " << b.name << ", BookAuthor: " << b.author << ", BookPrice: " << b.price << endl;; 63 os << *b.publisher << endl;; 64 return os; 65 } 66 67 }; 68 69 int main() 70 { 71 72 Publisher* pub = new Publisher("人民出版社", "北京市西城区", "021-2134343545"); 73 74 Book b1("算法精解", "Kyle Loudon", 56.2, pub); 75 76 cout << b1 << endl; 77 78 };
运行结果: