一、构造函数
class Date
{
public:
Date(int year = 2020, int month = 11, int day = 9)
//初始化列表成员
:_year(year)
,_month(month)
,_day(day)
{
//这里可以再次进行赋值
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date a(2020, 11,9);
return 0;
}
构造函数名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
- 如果没有自己编写构造函数,则编译器自动生成。如果已经编写,则编译器不在生成。
- 默认构造函数:编译器自动生成的, 无参构造函数,全缺省构造函数(三者只能存在一个)
- 构造函数的虽然名称叫构造,但是需要注意的是构造函数的主
要任务并不是开空间创建对象,而是初始化对象。 - 支持重载
- 类中有自定义成员,调用改类的构造函数时自动调用自定义成员的默认构造函数,如果没有,编译器报错。
二、析构函数
class Date
{
public:
Date(int month = 10, int day = 20)
:_year(2000)
,_month(month)
,_day(day)
{
}
~Date()
{
}
private:
int _year;
int _month;
int _day;
};
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值。
- 不支持重载
- 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数(如果有堆上的空间,则需要自己编写析构函数来释放掉,系统生成的不会释放)。
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
- 类中有自定义成员,调用改类的析构函数时自动调用自定义成员的析构函数
三、拷贝构造
class Date
{
public:
Date(int year = 2020, int month = 11, int day = 9)
:_year(year),
_month(month),
_day(day)
{
}
Date(const Date& d) //使用引用,否则会造成无穷递归,
//即创建临时变量时再次调用拷贝构造
{
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
};
int mian()
{
Date a(2020, 11, 9);
Date b(a);
return 0;
}
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用
- 拷贝构造函数是构造函数的一个重载形式。
- 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
- 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
- 如果有申请的堆上的空间,则需要显示定义拷贝构造函数。完成深拷贝。
四、赋值运算符重载
class Date
{
public:
Date(int year = 2020, int month = 11, int day = 9)
:_year(year),
_month(month),
_day(day)
{
}
~Date() {
cout << "haha" << endl;
}
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
int mian()
{
Date a;
Date b(2000, 1,1);
b = a;
return 0;
}
让一个对象去修改一个已经存在的对象,使其内容一致。
- 如果没有显示定义,编译器自动生成,完成浅拷贝。
- 如果类中有资源,则需要显示定义函数,完成深拷贝。
- 如果需要连续赋值,一般返回当前类的引用。
- 通过 *this != &对象 判断是否给自己赋值。
五 & 六、取地址运算符重载和 const 取地址运算符重载
用来获取对象的地址。
- 一般不需要显示定义,使用编译器自动生成的即可。