3、引用的应用、显示类型转换、面向对象

引用的应用

引用作为实参

  • 引用型形参函数的形参是实参的别名,避免了对象复制的开销
  • 非常引用型的参数,在函数内部可以修改参数的值
  • 常引用型的参数,可以防止函数内对实参的意外修改
// 当定义一个函数时,只要可以确定在函数内部绝对不修改实参,就可以给引用型形参加上const
#include <iostream>
using namespace std;void Swap(int& x, int& y){  //  非常引用型形参:可以在函数内部修改实参int z = x;x = y;y = z;
}
//指针传入
void Swap(int* x, int* y){int z = *x;*x = *y;*y = z;
}void Print(const int& x, const int& y){ // 常引用型形参:防止函数内部意外修改实参
//  x = 666; y = 888;cout << x << ", " << y << endl;
}int main( void ){int a = 10, b = 20;Swap(a,b);
//  Swap(&a,&b);cout << "a = " << a << ", b = " << b << endl;Print(a,b);Print(666,888);return 0;
}

引用作为返回值

引用型的返回值,从函数中返回引用一定要保证在函数返回以后,该引用的目标依然有效

  • 可以返回全局、静态变量的引用
  • 可以返回在堆中动态创建的对象的引用
  • 可以返回引用型参数本身
  • 可以返回成员变量的引用
  • 可以返回调用对象自身的引用
  • 不能返回局部变量的引用

引用型的返回值也分为常引用型和非常引用型。

引用和指针的区别

  • 指针可以不初始化,其目标可在初始化后随意变更(除非是指针常量),而引用必须初始化,且一旦初始化就无法变更其目标
  • 存在空指针,不存在空引用
  • 存在指向指针的指针,不存在引用的引用
  • 存在指针的引用,不存在引用的指针
  • 存在指针数组,不存在引用数组但存在数组引用
// 引用和指针在C++层面的差别
#include <iostream>
using namespace std;int main( void ){int a = 10, b = 20;int* pa = &a;        // 指针可以不做初始化,也可以做初始化pa = &b;             // 指针在初始化后,可以随意变更它所指向的内存空间int& ra = a;         // 引用必须初始化ra = b;              // 引用在初始化后,不可以变更它所引用的内存空间// 这里只是用b的值给ra所引用的内存空间赋值pa = NULL;           // 存在空指针
//  ra = NULL;           // 不存在空引用int** ppa = &pa;     // 存在二级指针
//  int&& rra = ra;      // 不存在二级引用int*& rpa = pa;      // 存在指针的引用
//  int&* pra = &ra;     // 不存在引用的指针int* pra = &ra;      // ok 但这不是引用的指针int x, y, z;int* p[3] = {&x, &y, &z};  // 存在指针数组
//  int& r[3] = {x, y, z};     // 不存在引用数组int arr[3];int(&parr)[3] = arr;       // 存在数组引用return 0;
}

指针数组和数组指针

指针数组:元素都是指针的数组

数组指针:指向一个数组的指针,保存的是首个元素的地址

显示类型转换

隐式类型转换

  • 任何基本类型变量之间都可以隐式转换
  • 任何其它类型的指针到void*都可以隐式转换
  • 任何类型的非常指针到同类型的常指针都可以隐式转换

必须显示类型转换的情况

  • void*到任何其它类型的指针都必须强转(显式转换)
  • 任何类型的常指针到同类型的非常指针都必须强转
  • 除了void*之外,其他类型的指针之间都必须强转

静态类型转换

  • static_cast<目标类型>(源类型变量)
  • 所有隐式类型转换(常类型除外,有专门的常类型转换)的逆转换,都需要静态类型转换
  • 自定义类型的转换

动态类型转换

  • dynamic_cast<目标类型>(源类型变量)
  • 多态父子类指针或引用之间的转换

常类型转换

  • const_cast<目标类型>(源类型变量)
  • 去除指针或引用上的const属性

重解释类型转换

  • reinterpret_cast<目标类型>(源类型变量)
  • 任意类型的指针之间的转换或引用之间的转换
  • 任意类型的指针和整型之间的转换
  • 尽量不要使用该转换,除非以上三种类型都无法实现
// 显式(强制)类型转换
#include <iostream>
using namespace std;int main(void){int a; double b; float c; short d; char e;// 任何基本类型变量之间都可以隐式转换a = b = c = d = e;e = d = c = b = a;// 任何其它类型的指针到void*都可以隐式转换void* pv = &a;pv = &b;pv = &c;pv = &d;pv = &e;// void*到任何其它类型的指针都必须强转(显式转换)  ******************************int* pa = static_cast<int*>(pv);       // void*-->int*的反向int*-->void*可以隐式转换double*pb = static_cast<double*>(pv);  // void*-->double*的方向double*-->void*可以隐式转换float* pc = static_cast<float*>(pv);short* pd = static_cast<short*>(pv);char* pe = static_cast<char*>(pv);// 任何类型的非常指针到同类型的常指针都可以隐式转换const int* cpa = pa;const double* cpb = pb;const float* cpc = pc;const short* cpd = pd;const char* cpe = pe;// 任何类型的常指针到同类型的非常指针都必须强转 ********************************pa = const_cast<int*>(cpa);   // const int*-->int*的反向int*-->const int*可以隐式转换pb = const_cast<double*>(cpb);pc = const_cast<float*>(cpc);pd = const_cast<short*>(cpd);pe = const_cast<char*>(cpe);// 除了void*之外,其他类型的指针之间都必须强转pa = reinterpret_cast<int*>(pb);  // double* --> int*pa = reinterpret_cast<int*>(38);return 0;
}

面向对象

面向对象的三大要件:封装、继承、多态

如何面向对象

  1. 至少掌握一种面向对象的语言,如C++
  2. 深入理解封装、继承、多态等面向对象的重要概念
  3. 学习设计模式,通过经验积累总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QtCreator调试时遇到中文时会卡住

参考帖子&#xff1a; https://bbs.csdn.net/topics/604917742 例如&#xff1a; 1.代码中有中文 btn->setText("开始"); 2.注释中有中文 btn->setText("strart"); // 开始

常见的关于vcruntime140.dll丢失的解决方法,找不到vcruntime140.dll丢失的问题

vcruntime140.dll文件是Microsoft Visual C Redistributable for Visual Studio 2015的一部分&#xff0c;它是运行使用Visual Studio 2015 开发的应用程序所必需的。如果你在尝试打开某些游戏或应用程序时遇到“vcruntime140.dll丢失”或“找不到vcruntime140.dll”这样的错误…

计算机网络入侵检测技术研究

摘 要 随着网络技术的发展&#xff0c;全球信息化的步伐越来越快&#xff0c;网络信息系统己成为一个单位、一个部门、一个行业&#xff0c;甚至成为一个关乎国家国计民生的基础设施&#xff0c;团此&#xff0c;网络安全就成为国防安全的重要组成部分&#xff0c;入侵检测技术…

论文解读:EfficientViT-提高吞吐量

摘要 要解决的问题 Vision transformers have shown great success due to their high model capabilities. However, their remarkable performance is accompanied by heavy computation costs, which makes them unsuitable for real-time applications. vit计算开销大&a…

热点新闻 | 许战海:零食行业的革新之道

2023年11月29日&#xff0c;华糖万商大会在南京国际会展中心隆重举行。著名战略定位咨询专家许战海受邀出席&#xff0c;在“量贩零食产业年度盛典”上发表了主题为《如何通过竞争战略布局年度规划》的精彩演讲&#xff0c;吸引了众多业界关注。 演讲中&#xff0c;许战海老师指…

网页开发 CSS

目录 CSS 概述 CSS 引入方式 CSS 选择器 基本选择器 组合选择器 伪类选择器 样式继承 选择器优先级 CSS 属性操作 文本属性 背景属性 边框属性 列表属性 dispaly属性 盒子模型&#xff08;重点&#xff09; float属性&#xff08;重点&#xff09; CSS 概述 C…

RPG项目01_UI面板Game

基于“RPG项目01_技能释放”&#xff0c;将UI包导入Unity场景中&#xff0c; 将图片放置 拖拽 取消勾选&#xff08;隐藏攻击切片&#xff09; 对技能添加蒙版 调节父子物体大小一致 将子类蒙版复制 执行5次 运行即可看到技能使用完的冷却条 在Scripts下创建UI文件夹 写代码&am…

4、类和对象、this指针、常对象和常函数

类和对象 类的一般形式 访问控制限定符 public 公有成员&#xff0c;谁都可以访问protected 保护成员&#xff0c;只有类自己和子类可以访问private 私有成员&#xff0c;只有类自己可以访问 类和结构的访问控制限定符区别 类的缺省访问控制限定为私有(private)结构的缺省访…

弱引用能指针 weak_ptr

弱引用智能指针 概述 弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手&#xff0c;它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;…

离散化 Discretization

离散化 **离散化有一个很重要的前提:**只关心数据之间的相对大小关系,不用关心绝对大小。 离散化,把无限空间中有限的个体映射到有限的空间中去。离散化是在不改变数据相对大小的条件下,对离散的数据进行相应的范围缩小。 离散化过程,将一组实数转换为一组整数,使得原始…

gimagereader安装在windows环境的方法

​ 首先github下载.exe的安装包&#xff0c; gtk或者qt5都可以。推荐gtk。 https://github.com/manisandro/gImageReader/releases 直接下载的地址&#xff1a; ​ https://github.com/manisandro/gImageReader/releases/download/master/gImageReader_latest_gtk_x86_64.ex…

前端知识笔记(二十一)———浏览器的缓存策略

浏览器缓存的策略主要分为两种&#xff1a;过期机制和验证机制。 过期机制&#xff1a;是指浏览器根据资源的过期时间&#xff0c;判断是否可以直接使用缓存中的副本&#xff0c;而无需向服务器发起请求。过期时间可以通过以下两种方式设置&#xff1a; Cache-Control&#xf…

Java基础数据类型

Java有八种基础的数据类型&#xff0c;它们被分为两个主要的类别&#xff1a;原始类型和引用类型。原始类型又被分为四类&#xff1a;整型、浮点型、字符型和布尔型。 整型&#xff08;Integral Types&#xff09;&#xff1a; 这些类型用于存储整数。它们包括&#xff1a; ○…

最高性能、最低错误率!一年沉寂,IBM王者归来

周一&#xff0c;国际商业机器公司&#xff08;IBM&#xff09;发布了首台量子计算机&#xff0c;它拥有1000多个量子比特&#xff08;相当于普通计算机中的数字比特&#xff09;。但该公司表示&#xff0c;现在它将转变思路&#xff0c;专注于提高机器的抗错能力&#xff0c;而…

羊大师提问鲜羊奶冷冻还好喝吗?

羊大师提问鲜羊奶冷冻还好喝吗&#xff1f; 在当今追求健康、养生的时代背景下&#xff0c;各种新奇的饮食趋势层出不穷。鲜羊奶冷冻成为了备受追捧的美食新潮流。不仅具备饮食的功能&#xff0c;更是一种享受。本文小编羊大师将从鲜羊奶冷冻的制作工艺、营养价值和市场前景等…

第2章 知识抽取:概述、方法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

『时间之外』这个不得不思考的问题,还是要说一下

还记得当初自己为什么选择计算机&#xff1f; 当初你问我为什么选择计算机&#xff0c;我笑着回答&#xff1a;“因为我梦想成为神奇的码农&#xff01;我想像编织魔法一样编写程序&#xff0c;创造出炫酷的虚拟世界&#xff01;”谁知道&#xff0c;我刚入门的那天&#xff0…

Ruff智能物联网网关助力工厂数智化运营,实现产量提升5%

数字化转型是大势所趋&#xff0c;以工业互联网为代表的数实融合是发展数字经济的重要引擎&#xff0c;也是新质生产力的一大助力。工业互联网是新工业革命的重要基石&#xff0c;加快工业互联网规模化应用&#xff0c;是数字技术和实体经济深度融合的关键支撑&#xff0c;是新…

12.5_黑马数据结构与算法Java

目录 001 二分查找 算法描述 002 二分查找 算法实现 003 二分查找 问题1 循环条件 004 二分查找 问题2 中间索引 thinking&#xff1a;反码补码原码&#xff1f; thinking&#xff1a;二进制转十进制&#xff1f; thinking&#xff1a;无符号右移&#xff1f; 005 二分…

SpringBoot 集成Netty、WebSocket,5分钟搭建聊天通信系统

文章目录 前言Netty简介使用Netty开发WebSocket应用程序开始项目一、添加依赖二、自定义处理器三、初始化通道加载器四、配置启动器五、添加启动监听器六、启动项目七、演示效果1. 客户端1看到其他客户端上线2. 客户端3收到客户端1发送的消息3. 客户端1收到客户端2下线前言 在…