类和对象(3)—— 对象的构造和析构

1、如果没有析构?

如果不用构造函数初始化,该怎么办:
  为每个类都提供一个public的initialize函数;
  对象创建后立即调用initialize函数进行初始化。

缺点
1)initialize只是一个普通的函数,必须显示的调用
2)一旦由于失误的原因,对象没有初始化,那么结果将是不确定
没有初始化的对象,其内部成员变量的值是不定的。

所以C++对类提供了一个给对象的初始化方案,就是构造函数

2、构造函数

定义

  C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数.

class 类名 
{
    类名形式参数)
    {
        构造体
    }
};

比如:

class A 
{
    A形参)
    {
    }
};

调用

  自动调用:一般情况下C++编译器会自动调用构造函数.
  手动调用:在一些情况下则需要手工调用构造函数.

规则:
1 在对象创建时自动调用,完成初始化相关工作。
2 无返回值,与类名同,默认无参,可以重载,可默认参数。
3 一经实现,默认不复存在。

3、析构函数

定义

  C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数.

class 类名 
{
    ~类名()
    {
        析构体
    }
};

比如:

class A 
{
    ~A()
    {}
};
规则:
1 对象销毁时,自动调用。完成销毁的善后工作。
2 无返值 ,与类名同。无参。不可以重载与默认参数

析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

class Test
{
public:
    //Test类的构造函数
    //在对象被创建的时候,用来初始化对象的函数
    Test(int a, int b)
    {
        m_x = a;
        m_y = b;
    }
    Test(int a)
    {
        m_x = a;
        m_y = 0;
    }
    //无参数的构造函数
    Test()
    {
        m_x = 0;
        m_y = 1;
    }
    void printT()
    {
        cout << "x=" << m_x << ",y=" << m_y << endl;
    }
    //析构函数和构造函数都没有返回值,
    //析构函数没有形参
    ~Test()
    {
        cout <<" ~Test()..." << endl;
    }
private:
    int m_x;
    int m_y;

};

void test()
{
    Test t1(10, 20);
    t1.printT();
    //在一个对象临死之前,要自动调用析构函数
    //即:在test执行完毕之后,会在"}"触发析构函数
}

int main(void)
{
    Test t1(10, 20);
    t1.printT();

    Test t2(100);
    t2.printT();

    Test t3;//就是调用类的无参数构造函数
    t3.printT();

    test();
    return 0;
}

 

posted @ 2018-10-15 15:33  悦悦的小屋  阅读(306)  评论(0编辑  收藏  举报