???面向对象编程(Object-Oriented Programming,简称OOP)是一种强大的编程范式,它将数据和操作数据的方法组织成类和对象,使得程序更易于理解、扩展和维护。在C++中,类和对象是OOP的核心概念,为程序员提供了一种结构化的方法来组织和设计代码。本节我们继续来学习C++的类和对象
拷贝构造函数也是特殊的成员函数
其特征如下:
1. 拷贝构造函数是构造函数的一个重载形式。?
2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。比如这个日期类的拷贝构造
Data(const Data& d);
3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
在一些简单的类里面,拷贝构造不需要自己写,编译器生成的默认的就可以了,比如这个日期类
class Data
{
public:
Data(int year = 1970, int month = 1, int day = 1);
Data(const Data& d);
~Data();
void Print();
int GetMonthDay();
private:
int _year;
int _month;
int _day;
};
只需要浅拷贝就可以,但比如这个二叉树节点类
class TreeNode
{
public:
TreeNode(TreeType x);
int Height();
~TreeNode();
void TreeDestroy();
void InOrder();
private:
TreeType _val;
TreeNode* _left;
TreeNode* _right;
};
????????如果使用值拷贝,那么拷贝过去的指向的空间和原指向的空间是一块,在对拷贝的执行销毁后,原先的就不能再使用,并且还会发生对同一块空间释放多次的问题,这时就需要自己写拷贝构造,实现深拷贝,
????????C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型?operator操作符(参数列表)
注意:
Data operator+(int day);
Data& operator+=(int day);
以日期类举例子
+=会使得原对象进行改变,返回值也是原对象,所以使用引用返回提高速率
Data& Data::operator+=(int day)
{
if (day < 0)
return *this -= (-day);
_day += day;
while (_day > GetMonthDay())
{
_day -= GetMonthDay();
_month += 1;
if (_month == 13)
{
_year += 1;
_month = 1;
}
}
return *this;
}
加法直接复用+=,加法不改变原对象
Data Data::operator+(int day) const
{
Data d(*this);
d += day;
return d;
}
需要注意加法重载里面,不能返回d的引用,d的生命周期只在函数里面
类似+=
Data& Data::operator-=(int day)
{
if (day < 0)
return *this += (-day);
_day -= day;
while (_day<=0)
{
_month -= 1;
if (_month == 0)
{
_year -= 1;
_month = 12;
}
_day += GetMonthDay();
}
return *this;
}
Data Data::operator-(int day)
{
Data d(*this);
d -= day;
return d;
}
bool operator==(const Data& d) ;
bool operator>=(const Data& d) ;
bool operator<=(const Data& d) ;
bool operator>(const Data& d) ;
bool operator<(const Data& d) ;
bool operator!=(const Data& d) ;
对于日期类比如==
bool Data::operator==(const Data& d)
{
return _year == d._year && _month == d._month && _day == d._day;
}
其他的都可以相互复用,比如写了>和==就可以在<,<=,>=,!=相互复用