当前位置: 首页 > news >正文

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

注意:

  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;
}

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

相关文章:

  • Influxdb2修改管理员密码
  • 【MySQL】ANY函数 的巧用(筛选字段 > ANY(语句) 和 筛选字段 < ANY(语句))
  • 【80211-2022】【学习记录】【第九章】Duration/ID 字段(Qos STA)
  • L1-012 计算指数(Java)
  • go 中的 fmt 占位符
  • 【React】常见疑问的整理
  • thinkphp递归实现无限级子分类合并上级children
  • 【idea】idea插件编写教程,博主原创idea插件 欢迎下载
  • Openharmony 对应Android基本系统信息
  • 【Linux系统编程二十六】:线程控制与线程特性(Linux中线程库/线程创建/线程退出/线程等待)
  • 路径规划(二):Dijkstra算法
  • 【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
  • 注解与反射接口AnnotatedElement
  • PTA✨C语言 就不告诉你
  • Python书籍推荐,建议收藏
  • [译] 怎样写一个基础的编译器
  • angular2 简述
  • Angular4 模板式表单用法以及验证
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • go append函数以及写入
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Linux CTF 逆向入门
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 工作中总结前端开发流程--vue项目
  • 好的网址,关于.net 4.0 ,vs 2010
  • 让你的分享飞起来——极光推出社会化分享组件
  • 数据科学 第 3 章 11 字符串处理
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 在Mac OS X上安装 Ruby运行环境
  • 怎样选择前端框架
  • Prometheus VS InfluxDB
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (175)FPGA门控时钟技术
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 使用配置文件
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net中ListT 泛型转成DataTable、DataSet
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android] Android ActivityManager
  • [Android] Upload package to device fails #2720
  • [BJDCTF2020]The mystery of ip
  • [BZOJ] 2044: 三维导弹拦截
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C]编译和预处理详解
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [js] 正则表达式
  • [JS设计模式]Prototype Pattern
  • [LeetCode] 19. 删除链表的倒数第 N 个结点