类有六个成员函数:1.构造函数
2.拷贝构造
3.析构函数
4.赋值操作符重载
5.取地址操作符重载
6.const修饰的取地址操作符重载
一.构造函数
类的成员变量是私有的,要对它们进行初始化,必须用一个公有的成员函数来进行,同时这个函数应该仅在定义对象是调用一次,该函数就是构造函数
1.特点:1.函数名与类名相同;
2.无返回值
3.可以重载
4.有初始化列表
class Date
{
public:
Date(int year, int month, int day)//构造函数,没有返回值类型
{
_year = year;
_month = month;
_day = day;
cout << "Date(int year, int month, int day)" << endl;
}
Date() //无参构造函数
{
cout << "Date()" << endl;
}
private:
int _year;
int _month;
int _day;
};
5.若没有定义,编译器会自动提供
6.无参的构造函数和带缺省值的构造函数都称为缺省构造函数(缺省构造函数只能有一个)
Date() //无参构造函数
{
cout << "Date()" << endl;
}
Date(int year = 2017,int month = 10,int day = 20) //带缺省的构造函数
{
_year = year; //无参构造函数和带缺省的构造函数都叫缺省构造函数,且只能有一个
_month = month;
_day = day;
}
7.创建对象时调用,且只能调用一次
2.构造函数的作用
a.构造对象
b.初始化对象
c.类型转换——构造函数为单参时(若不想类型转换,用explicit关键字)
3.构造函数的初始化列表
a.以冒号(:)开头
b.用逗号隔开每一个变量(,)
c.用圆括号()进行初始化
class Date
{
public:
Date(int year=2017, int month=10, int day=20)
:_year(year)//初始化列表并不能指定数据成员的初始化顺序,初始化顺序由 变量在类中的定义顺序决定
, _month(month) //对象还没有创造成功
, _day(day)
{ //对象创建成功
}
private:
int _year;
int _month;
int _day;
};
注:
1)每个成员变量只能在初始化列表中出现一次
2)初始化列表仅用于初始化成员变量
3)初始化列表并不能指定成员的初始化顺序,数据的初始化顺序由变量在类中的定义决定
4)尽量避免用成员初始化成员,成员的初始化顺序最好与定义保持一致
4.必须在构造函数的初始化列表中初始化的变量
a.const修饰的变量
b.引用
c.没有缺省构造函数的类类型成员
若没有定义构造函数,系统虎皮默认合成一个构造函数。系统提供的默认构造函数,只对定义在全局作用域中的对象进行初始化(内置类型和复合类型的成员)
二.拷贝构造函数
创建对象时,使用同类型的对象来进行初始化,这时用到的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数
1.特点:
a.拷贝构造函数其实是构造函数的重载
b.没有返回值
c.拷贝构造函数的参数只有一个且必须使用引用传参,否则会引发无穷递归
d.若为显示定义,系统会默认缺省的拷贝构造函数
例:
class Date
{
public:
Date(int year = 2017, int month = 10, int day = 20)
:_year(year)
, _month(month)
, _day(day)
{
cout << "Date() " << this << endl;
}
Date(const Date& d)//拷贝构造,构造函数的重载,必须为单参
//必须为引用
:_year(d._year)
, _month(d._month)
, _day(d._day)
{
cout << "Date(const Date& d) "<<this << endl;
}
private:
int _year;
int _month;
int _day;
};
三.析构函数
当一个对象生命周期结束时,c++编译系统会自动调用一个成员函数,做一些清理工作,这个特殊的函数就是析构函数
1.特点:
a. 析构函数的函数名: ~类名
b.无返回值
c.无参数列表,不能重载,所以一个类只有一个析构函数
d.在对象生命周期结束时,c++系统会自动调用
e.析构函数并不是删除对象,而是做一些清理工作
class Date
{
public:
Date(int year = 2017, int month = 10, int day = 20)
:_year(year)
, _month(month)
, _day(day)
{
cout << "Date() " << this << endl;
}
~Date()//析构函数只有一个,且不能重载(因为没有参数列表)
{
cout << "~Date()" << endl;
}
private:
int _year;
int _month;
int _day;
};