一. 构造函数
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类来讲,它进行的工作就是释放动态内存,在实现代码的过程中,该种析构函数就必须程序员在类中给出来。
