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

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

目录

1.数组类

2.运算符重载

2.1加号运算符

2.1.1成员函数实现

2.1.2全局函数实现

2.1.3加号重载

2.2左移运算符

2.3递增运算符

2.4指针运算符

2.5赋值运算符


1.数组类

//默认构造函数
MyArray::MyArray()
{m_Size = 0;m_Capacity = 100;pAddress = new int[m_Capacity];
}//析构函数
MyArray::~MyArray()
{if (nullptr != pAddress){delete[] pAddress;pAddress = nullptr;}}//有参构造
MyArray::MyArray(int capacity)
{m_Size = 0;m_Capacity = capacity;pAddress = new int[m_Capacity];
}//拷贝构造
MyArray::MyArray(const MyArray& arr)
{m_Size = arr.m_Size;m_Capacity = arr.m_Capacity;pAddress = new int[arr.m_Capacity];for (int i = 0; i < arr.m_Size; i++){pAddress[i] = arr.pAddress[i];}
}//根据位置设置数据
void MyArray::setData(int pos, int data)
{pAddress[pos] = data;
}//获取数据
int MyArray::getData(int pos)
{return pAddress[pos];
}//尾插
void MyArray::pushBack(int data)
{if (m_Size > m_Capacity){return;}pAddress[m_Size] = data;m_Size++;
}//获取容量
int MyArray::getCapacity()
{return m_Capacity;
}//获取大小
int MyArray::getSize()
{return m_Size;
}

2.运算符重载

给运算符新的含义,可以实现不同数据类型的运算。

  • 运算符需要两个参数时,局部实现只传一个参数,全局实现传两个参数;
  • 运算符需要一个参数时,局部实现不传参数,全局实现传一个参数。

2.1加号运算符

例如,此时p1+p2编译器不知道如何运算,需要我们自定义

2.1.1成员函数实现

 

2.1.2全局函数实现

2.1.3加号重载

只要将函数名改成operator+即可。

2.2左移运算符

cout << 10;
cout << p1;

输出一个自定义对象时,编译器懵了,此时需要重载左移运算符。

ostream& operator<<(ostream& cout, Person& p)
{cout << p.m_A << p.m_B;return cout;
}

cout返回的还是cout对象,因此,返回值类型是ostream&。

2.3递增运算符

//前置递增
cout << ++myInter;后置递增
cout << myInter++;

对一个对象进行自增操作,编译器懵了,此时需要重载递增运算符。

//前置递增
MyInter& operator++()
{m_Num++;return *this;
}//后置递增
int operator++(int)
{int temp=m_Num;m_Num++;return temp;
}
  • 前置递增返回值的类型是引用后置递增返回值的类型是int
  • 后置递增添加一个int做占位参数,来区分前置和后置。

2.4指针运算符

//sp释放时,会自动释放Person
smartPoint sp(new Person(18));

智能指针smartPoint本质上是一个类,可以托管new出的对象,使其自动释放。

但此时,sp本质是个对象,无法像指针一样操作Person的成员,所以需要重载“->”和“*”。

Person* m_Person;Person* operator->()
{return m_Person;
}Person& operator*()
{return *m_Person;
}

2.5赋值运算符

有属性指向堆区,并用到赋值运算时,需要重载赋值运算。因为默认的赋值行为是值拷贝的。

class Person
{
public:Person(char* name, int age){m_Name = new char[strlen(name) + 1];strcpy(m_Name, name);m_Age = age;}//赋值运算符的重载Person& operator=(const Person& p){m_Age = p.m_Age;if (nullptr != m_Name){delete m_Name;m_Name = nullptr;}m_Name = new char[strlen(p.m_Name) + 1];strcpy(m_Name, p.m_Name);}char* m_Name;int m_Age;
};

http://www.lryc.cn/news/446361.html

相关文章:

  • echarts地图的简单使用
  • Qt 项目优化实践方向
  • 常见的15个:自然语言处理(NLP)实战项目
  • CKKS同态加密通用函数近似方法和openFHE实现
  • Webpack 5的新特性:Asset Modules与Dynamic Import
  • 解释python requests包的timeout
  • 蒙语学习快速方法,速记蒙语单词怎么学习更高效!
  • Vue3组件通信13种方法
  • Servlet入门:服务端小程序的初试(自己学习整理的资料)
  • 代码随想录算法训练营第三七天| 动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换
  • [报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface
  • B-树(不是B减树)原理剖析(1)
  • 【shell脚本8】Shell脚本学习--其他
  • 《深度学习》ResNet残差网络、BN批处理层 结构、原理详解
  • javadoc:jdk 9通过javadoc API读取java源码中的注释信息(comment)
  • nordic使用FDS保存数据需要注意的地方
  • docker-compose集群(单机多节点)环境搭建与使用
  • 从静态多态、动态多态到虚函数表、虚函数指针
  • 用 Pygame 实现一个乒乓球游戏
  • 基于大数据可视化的化妆品推荐及数据分析系统
  • Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)
  • 数学基础 -- 微积分最优化之一个最简单的例子
  • kubernetes K8S 结合 Istio 实现流量治理
  • Selenium with Python学习笔记整理(网课+网站持续更新)
  • 1.随机事件与概率
  • Redis结合Caffeine实现二级缓存:提高应用程序性能
  • 【LLM】Ollama:本地大模型 WebAPI 调用
  • SpringBoot集成阿里easyexcel(二)Excel监听以及常用工具类
  • 使用ELK Stack进行日志管理和分析:从入门到精通
  • 前端框架对比与选择