对象构造和析构

62 阅读1分钟

对象构造

如何允许对象在定义的时候赋初值:

  • 定义一个特殊的称为构造函数的成员函数,让编译器在定义对象时自动调用该函数

构造函数的用法跟其他成员函数不一样

  • 函数名与类名相同
  • 无返回值,且不能指明返回类型

eg

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
private:
    std::string *company;
    long shares;
    double share_val;
    double total_val;
    void set_tot() {total_val = shares * share_val;}
public:
    void acquire(const std::string & co, long n, double pr);
    void buy(long num, double price);
    void sell(long num, double price);
    void update(double price);
    void show();
};

#endif

构造函数

Stock(const std::string & co, long n, double pr = 0)
{
    company = new char[strlen(co) + 1];
    strcpy(company, co);
    if (n < 0) {
        std:cout << "Number of shares can't be negative;"
            << company << " shares set to 0.\n";
        shares = 0;
    }
    else shares = n ;
    share_val = pr;
    set_tot();
}    

隐适调用: 定义对象时自动调用
如: Stock st1("comp1", 20, 3.4)
或: Stock *sp = new Stock("comp1", 20, 3.4)

显示调用
如: Stock st1 = Stock("comp1",20, 3.4)
或: Srock st1 ("comp1", 20, 3.4);
st1 = Stock("comp2", 40, 5.4)

不管有没有定义构造函数,编译器会加一个没有参数的默认构造函数
构造函数是可以重载的

对象析构

对象生命周期结束被销毁前会调用析构函数做一个善后处理
主要是处理对象中的动态空间
如果没有这些特殊处理的情况,不需要定义析构函数,或定义一个空析构函数
如果类中没有定义析构函数,编译器会生成一个空的析构函数(什么事情也不做,要做自己加)

析构函数原型: ~ 类名(){ 函数体 }
没有参数 也没有返回值

~Stock()
{
    delete company;
}