###类有六个默认的成员函数,是构造函数,析构函数,拷贝构造函数,赋值操作符重载,取地址操作符重载,const修饰的取地址操作符重载,接下来,介绍前三种成员函数
构造函数
构造函数的作用是初始化对象的数据成员,其函数名和类名相同
代码如下:
class Time
{
public:
Time(int h , int m , int s ); //带有默认参数的构造函数
//Time(int h,int m,int s);不带默认参数的构造函数
private:
int hour;
int min;
int sec;
};
//类外定义构造函数
Time::Time(int h=0,int m=0,int s=0)
{
hour = h;
min = m;
sec = s;
}
int main()
{
Time t1(10, 23, 45);
Time t2; //使用默认的结果
}
参数初始化列表
另外一种对对象的数据成员进行初始化的方法
形式如下:
class Time
{
public:
Time(int h, int m, int s) //声明构造函数
: hour(h)
, min(m) //参数初始化表
, sec(s)
{}
private:
int hour;
int min;
int sec;
};
那么什么时候用初始化列表,什么时候直接用构造函数体进行初始化
参数初始化表需要注意几个点
- 初始化数据相对较多时,初始化列表更显现优越性
- 初始化列表中{}成为构造函数体中的内容可有可无,但是当数据成员是数组时,则不能用初始化列表进行初始化,需要放在构造函数体中,例如
class student
{
public:
student(int _num, char _sex, char _name[])
:num(_num)
, sex(_sex)
{
strcpy(name, _name);
}
private:
int num;
char sex;
char name[20];
};
3.对于const修饰的数据成员或者是引用类型的数据成员,不能用赋值语句进行直接赋值,只能用参数初始化表来进行初始化,
析构函数
析构函数的作用是在撤销对象之占用的内存之前完成一些清理工作(不是删除作用),使这部分内存可以让新对象使用
形式如下
class Time
{
~Time() //析构函数
{
cout << "called" << endl; //输出相关信息
}
};
#调用析构函数和构造函数的顺序
对象一旦被定义,系统就会自动调用构造函数,等对象使用完毕后调用析构函数,但是当定义多个对象时,调用顺序如下
拷贝构造函数
拷贝构造函数的作用就是在建立一个新对象时利用已经存在的对象去初始化这个新对象
形式如下
class Time
{
public:
Time(Time &p) //定义拷贝构造函数
{
hour = p.hour;
min = p.min;
sec = p.sec;
}
private:
int hour;
int min;
int sec
};
//调用的两种形式形式
//Time t2(t1);
//Time t2 = t1;
若不自定义拷贝构造函数,则系统调用默认构造函数,即直接可以使用Time t2(t1);
##对象的复制与赋值
-
同类之间的对象是可以互相赋值的,但只是对数据成员进行赋值,例如
student s1, s2;
…
s1 = s2; -
对象的复制则是利用已经存在的对象去克隆出多个完全相同的对象
-
两者区别在于,对象的赋值,必须是对已经定义好的对象进行赋值,而对象的复制则是创建一个对象时使它和已经存在的对象完全相同(包括对象的结构和数据成员的值)
Time t1;
Time t2(t1)
或者
Time t1;
Time t2 = t1, t3 = t2;