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