类中默认成员函数浅析(一)

构造函数:
是一个特殊的成员函数(随着对象创建而自动被调用的),用于来初始化对象,在对象的生命周期中只调用一次
特征:
1.名字与类名相同
2.无返回值(并不等同于void)
3.可以重载(类可以有多个构造函数,其名字都必须相同但参数列表可以不同)
4.类对象创建时自动执行!!!
5.构造函数可以在类中定义,也可以在类外定义(在类中定义的成员函数,编译器可能会将其当成内联函数来处理)
class Date()
{
public:
/Date() //无参数,形成重载
{
_year = 1997;
_month = 01;
_day = 01;
}
/
Date(int year,int month,int day) //无返回值类型,并不是void
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
}

注意:1.若一个类没有定义构造函数,则会自动生成一个不带参数的默认构造函数Date(){};

此时创建Date d对象会报错,如何解决?
答:将Date(int year,int month,int day)给上缺省值,即Date(int year = 1997,int month = 01,int day = 01),使得对象若没有参数则直接使用缺省值(无参的和带有全缺省的构造函数只能存在一个,即Date(){};和Date(int year = 1997,int month = 01,int day = 01只能存在一个)

析构函数:
与构造函数功能相反(~),在对象被销毁时编译器自动调用,析构函数体做一些对象删除前的相关资源清理工作(不是删除对象)
特征:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数
    注意:对于用new运算符动态创建的对象,只有用delete释放对象时才调用析构函数

拷贝构造函数:用已经存在的对象创建新的对象
只有单个形参,该形参是对本类类型对象的引用(因为是拷贝,不需要更改原对象的任何参数,为了安全起见一般常用const修饰)
特征:

  1. 拷贝构造函数其实是一个构造函数的重载。
    1. 拷贝构造函数的参数只有一个且必须使用引用传参(使用传值方式会引发无穷递归调用)
  2. 若未显示定义,系统会默认生成默认的拷贝构造函数。 默认的拷贝构造函数会按照成员的声明顺序依次拷贝类成员进行初始化(默认方式下是原封不动完全拷贝,包括地址)
    Date(const Date& d)
    {
    _year = d._year;
    _month = d._month;
    _day = d._day;
    }
    哪些类的拷贝构造函数用户一定要提供?
    对象中有资源(动态的顺序表,若拷贝s1到s2时,因为要进行free,先free的是s2,在free之后s2指向空间已经被销毁而s1并不知道,所以在s1 free的时候出错)
0%