C++类和对象(中)
系列文章目录
C++类和对象(上)
文章目录
目录
系列文章目录
文章目录
前言
一.拷贝构造函数函数
二.运算符重载
1.+ += 运算符重载
2.- -=运算符重载
3.逻辑运算符重载
前言
面向对象编程(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操作符(参数列表)
注意:
- 不能通过连接其他符号来创建新的操作符:比如operator@
- 重载操作符必须有一个类类型参数
- 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义
- 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
- .* :: sizeof ?: . 注意以上5个运算符不能重载
1.+ += 运算符重载
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的生命周期只在函数里面
2.- -=运算符重载
类似+=
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;
}
3.逻辑运算符重载
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;
}
其他的都可以相互复用,比如写了>和==就可以在<,<=,>=,!=相互复用