C++类和对象(中)

发布时间:2024年01月09日

系列文章目录

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操作符(参数列表)

注意:

  1. 不能通过连接其他符号来创建新的操作符:比如operator@
  2. 重载操作符必须有一个类类型参数
  3. 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义
  4. 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  5. .*? ? ?::? ? 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;
}

其他的都可以相互复用,比如写了>和==就可以在<,<=,>=,!=相互复用

文章来源:https://blog.csdn.net/2301_77838258/article/details/135485055
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。