博主个人主页:不是笨小孩
⏩专栏分类:数据结构与算法 C++ 刷题专栏 C语言
代码仓库:笨小孩的代码库
⏩社区:不是笨小孩
欢迎大家三连关注,一起学习,一起进步!!
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
class Date
{
public:
//无参构造函数
Date()
{}
//带参构造函数
Date(int year,int month,int day)
{}
private:
int _year;
int _month;
int _day;
};
构造函数的参数是可以和缺省一起使用。
class Date
{
public:
//带参构造函数
Date(int year = 1,int month = 1,int day = 1)
{}
private:
int _year;
int _month;
int _day;
};
构造函数的特性:
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
class Date
{
public:
//析构函数
~Date()
{}
private:
int _year;
int _month;
int _day;
};
析构函数的特性
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
class Date
{
public:
//构造函数
Date(int year = 1, int month = 1, int day = 1)
{
_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 main()
{
//调用构造
Date d(2023, 8, 21);
//调用拷贝构造
Date d1(d);
//等价于d1(d)
Date d2 = d;
return 0;
}
拷贝构造函数的特性:
使用已存在对象创建新对象
函数参数类型为类类型对象
函数返回值类型为类类型对象
1. 赋值运算符重载格式
class Date
{
public:
//构造函数
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//赋值运算符重载
bool operator==(Date& d)
{
return _year == d._year && _month == d._month && _day == d._day;
}
Date& operator=(Date& d)
{
if (*this == d)
{
return *this;
}
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d(2023, 2, 20);
Date d1, d2;
d1 = d2 = d;
}
2. 赋值运算符只能重载成类的成员函数不能重载成全局函数
赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
class Date
{
public:
Date* operator&()
{
return this;
}
const Date* operator&() const
{
return this;
}
private:
int _year;
int _month;
int _day;
};
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
class Date
{
public:
void print() const
{}
private:
int _year;
int _month;
int _day;
};
不可以,因为会涉及权限放大的问题。
可以,权限可以缩小。
不可以,权限会放大。
可以,权限可以缩小。
今天的分享就到这里,感谢到家的关注和支持。