3.析构函数
用类创建一个对象,这个对象使用完毕后,就会调用析构函数,析构函数主要完成清理工作。类的对象时放在栈里面。
析构函数没有返回值和类型声明。
eg:如果构造函数使用new来分配内存,析构函数就需要delete来释放这些内存。
Stock::~Stock()
{
}
。
Stock.h
#pragma once #ifndef __Stock__H__ #define __Stock__H__ #include <string> class Stock { private: std::string company; long num; double price; double all_price; void set_total() { all_price = price * num; } public: //void acquire(const std::string &com, double pr, long n); Stock(const std::string& com, double pr, long n); ~Stock(); void buy(double n, double pr); void sell(double n, double pr); void update(double pr); void show(); }; #endifStock.cpp
#include "Stock.h" #include <iostream> /* void Stock::acquire(const std::string& com, double pr, long n) { company = com; if (n < 0) { std::cout << "n < 0 is error!" << std::endl; //num = 0; } else { num = n; } price = pr; set_total(); } */ Stock::Stock(const std::string& com, double pr, long n) { company = com; if (n < 0) { std::cout << "n < 0 is error!" << std::endl; //num = 0; } else { num = n; } price = pr; set_total(); } Stock::~Stock() { std::cout << "Stock " << company << " is destroyed." << std::endl; } void Stock::buy(double n, double pr) { if (n < 0) { std::cout << "n < 0 is error!" << std::endl; //num = 0; } else { num += n; price = pr; set_total(); } } void Stock::sell(double n, double pr) { if (n < 0) { std::cout << "n < 0 is error!" << std::endl; } else if(n > num) { std::cout << "n < 0 is error!" << std::endl; } else { num = num - n; price = pr; set_total(); } } void Stock::update(double pr) { price = pr; set_total(); } void Stock::show() { std::cout << "company: " << company << std::endl; std::cout << "num: " << num << std::endl; std::cout << "price: " << price << std::endl; std::cout << "all_price: " << all_price << std::endl; }.
userstock00.cpp
#include "Stock.h" int main() { Stock stock1 = Stock("Apple Inc.", 150.0, 100); //显式地调用构造函数 Stock stock2("world Cabbage", 250, 1.25);//隐式地调用构造函数 //stock.acquire("Apple Inc.", 150.0, 100); stock1.show(); //stock.buy(50, 155.0); stock2.show(); }printf:
company: Apple Inc. num: 100 price: 150 all_price: 15000 company: world Cabbage num: 1 price: 250 all_price: 250 Stock world Cabbage is destroyed.##类的对象时放在栈里面。所以先入后出。 Stock Apple Inc. is destroyed. D:\QT_C++_code\NO.10\1\Project1\x64\Debug\Project1.exe (进程 11848)已退出,代码为 0 (0x0)。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .。
stock1 = stock2; stock1.show(); //stock.buy(50, 155.0); stock2.show();类与类之间可以直接赋值。
。
//错误 const Stock land = Stock("Apple Inc.", 150.0, 100);//这个是常量,但是show函数中没有任何保护机制来确保变量不被修改,因而会报错。 land.show();。
可以这样改,变成 const成员函数
void stock::show() const { ... }
总结:
构造函数的名称与类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标不同。
Bozo(const char * fname, const char * lname);
//初始化对象
Bozo bozetta = Bozo("dfsdf", "fbccbc");
Bozo fufu("dfsdfsdas", "fbccbczxcxz");
Bozo *pc = new Bozo("dfsdf", "fbccbc");
默认构造函数无参数,因此创建对象时没有进行显示初始化,就将调用默认构造函数。如果程序中没有提供任何构造函数,编译器会提供一个默认构造函数;否则必须自己提供默认构造函数。默认构造函数可以没有任何参数,如果有,则必须给所有参数提供默认值。
每个类只能有一个析构函数。构造函数中用了new,必须提供使用了delete的析构函数