C++类的默认成员函数——构造函数&析构函数

一. 构造函数

1. 构造函数的简单介绍

        构造函数是一种特使的方法。主要用来在创建对象时初始化对象,即对对象的成员变量赋值。当成员变量是私有的时候,要对它们初始化就必须用一个公有的成员函数来进行。同时这个成员函数应在仅且在对象定义时自动的执行一次,这个函数我们就叫做构造函数。

2. 构造函数的特点

(1)函数名与类名相同;

(2)无返回值;

(3)对象构造时(对象实例化时)系统自动调用对应的构造函数;

(4)构造函数可以重载;

(5)构造函数可以在类内定义,也可以在类外定义;

(6)如果在类定义中没有给出构造函数,则C++编译器会给出缺省的一个构造函数;但只要我们给出一个构造函数(无参的也算),系统就不会生成缺省的构造函数;gz

(7)无参构造函数和全缺省的构造函数都被认为是缺省的构造函数,并且缺省的构造函数只能有一个;

(8)一个类中可以有多个构造函数。

3. 构造函数的实现

(1)无参构造函数&带参构造函数

#include <iostream>
using namespace std;
                                                                                                                                                      
//(1)无参&带参构造函数
class Date
{
    public:
        //构造函数也可以定义在类外
        Date()//无参构造函数
        {}
        
        Date(int year, int month, int day)//带参构造函数
        {
            _year = year;
            _month = month;
            _day = day;
        }
        void Display()
        {
            cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
        }
    private:
        int _year;
        int _month;
        int _day;
};
int main()
{
    Date d1;//调用无参构造函数
    Date d2(1998, 5, 27);//调用带参构造函数
    Date d3();//没调用构造函数定义对象->不能这样用,但仅定义时,编译器不会报错
    
    d1.Display();
    d2.Display();
    //d3.Display();//使用未调用构造函数定义的对象,出错                                                                                                
    return 0;
}

        运行结果为:


        构造函数也可以定义在类外:

#include <iostream>
using namespace std;

//(1)无参&带参构造函数
class Date
{
    public:
        //构造函数也可以定义在类外
        Date();//无参构造函数 
            
        Date(int year, int month, int day);//带参构造函数 
        void Display()
        {   
            cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
        }   
    private:
        int _year;
        int _month;                                                                                                                                   
        int _day;
};
Date::Date()
{
    _year = 1000;
    _month = 5;
    _day = 28;
}
Date::Date(int year, int month, int day)
{
    _year = year;
    _month = month;
    _day = day;
}

int main()
{
    Date d1;//调用无参构造函数
    Date d2(1998, 5, 27);//调用带参构造函数
    Date d3();//没调用构造函数定义对象->不能这样用,但仅定义时,编译器不会报错
    
    d1.Display();
    d2.Display();
    //d3.Display();//使用未调用构造函数定义的对象,出错                                                                                                
    return 0;
}

        运行结果为:


(2)带缺省参数的构造函数

#include <iostream>
using namespace std;

//(2)带缺省参数的构造函数
class Date
{
    public:
        Date(int year=2000, int month=1, int day=1)//全缺省参数的构造函数
        {   
            _year = year;
            _month = month;
            _day = day;
        }   
           
        Date(int year, int month=1)//半缺省参数的构造函数
        {   
            _year = year;
            _month = month;
            _day = 1;
        }   
        void Display()
        {   
            cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
        }   
    private:
        int _year;
        int _month;                                                                                                                                   
        int _day;
};
int main()
{
    //(2)
    Date d1;//调用全缺省构造函数
    Date d2(1998, 1, 9);
    Date(2018,5,27).Display();//匿名
    d1.Display();
    d2.Display();
    return 0;
}

        运行结果为:


(3)系统默认的构造函数

#include <iostream>
using namespace std;

//(3)调用默认构造函数                                                                                                                                 
class Date
{
    public:
        void Display()
        {
            cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
        }
        void SetDate(int year, int month, int day)
        {
            _year = year;
            _month = month;
            _day = day;
        }
    private:
        int _year;
        int _month;
        int _day;
};
int main()
{
    Date d1;//调用全缺省构造函数
    d1.Display();
    return 0;
}

        运行结果为:



二. 析构函数

1. 析构函数的简单介绍

        当一个对象的生命周期结束时,C++编译系统会自动的调用一个成员函数,这个特殊的成员函数即析构函数,它往往用来进行“清理善后”的工作。

2. 析构函数的特点

(1)函数名为类名前加上“~”;

(2)析构函数无参数无返回值;

(3)一个类有且只有一个析构函数;

(4)若在内中没有给出析构函数,则系统会自动生成缺省的析构函数;

(5)对象生命周期结束时,C++编译系统自动调用析构函数;

(6)析构函数的函数内部实现的并不是删除对象,而是做一些清理工作;

(7)一般来讲,若不需要进行特殊的清理工作(如动态释放等),使用系统缺省的析构函数即可。

3. 析构函数的实现

#include <iostream>
#include <stdlib.h>
using namespace std;

class Date
{
    public:
        Date(int year, int month, int day)
        {
            _year = year;
            _month = month;
            _day = day;
        }
        ~Date()//析构函数->清理工作
        {
            cout<<"~Date()"<<endl;
        }
        void Display()
        {
            cout<<this->_year<<"-"<<this->_month<<"-"<<this->_day<<endl;
        }
    private:
        int _year;
        int _month;
        int _day;
};

class MyVector                                                                                                                                        
{
    public:
        MyVector(size_t capacity = 0)
        {
            if(capacity == 0)
            {
                _a = NULL;
                _size = 0;
                _capacity = 0;
            }
            else
            {
                _a = (int*)malloc(capacity*sizeof(int));
                _size = 0;
                _capacity = capacity;
            }
        }
        ~MyVector()//这里析构函数所作清理工作是动态释放
        {
            if(_a)
            {
                free(_a);
                _a = NULL;
            }
            _size = _capacity = 0;
        }
    private:
        int* _a;
        size_t _size;
        size_t _capacity;
};                                                                                                                                                    

int main()
{
    Date d1(1900, 1, 1);
    d1.Display();
    
    MyVector v1;
    MyVector v2(10);
    return 0;
}    

        运行结果如下:


        其中,Date类中的析构函数就没有做什么清理工作,它其实可以采用系统默认的析构函数。对于MyVector类来讲,它进行的工作就是释放动态内存,在实现代码的过程中,该种析构函数就必须程序员在类中给出来。


猜你喜欢

转载自blog.csdn.net/lycorisradiata__/article/details/80954594