C++入门编程 ---- 助你更好理解C++的奥妙(一)

简介: C++入门编程 ---- 助你更好理解C++的奥妙(一)

引用的概念与性质:

引用 其实很好理解 通俗的来讲就是给一个东西取一个 别名 就像是我们生活中的 “外号” 一样我们叫一个人的名字他会答应 叫他的外号也会答应


引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量额外开辟空间,他和他引用的变量共用一块空间

11605778282a4d4c805db739f088d933.png

所以呢 一个变量的别名和他的地址是一样的 一方改变另一方也就跟着变了 所以我们的swap函数也就可以这样写了

void swap(int* p, int* q)//C语言
{
  int tmp = *p;
  *p = *q;
  *q = tmp;
}
void swap(int& p, int& q)//C++
{
  int tmp = p;
  p = q;
  q = tmp;
}
int main()
{
  int a = 10, b = 20;
  swap(&a, &b);
  cout << " a = " << a << " b = " << b << endl;
  int c = 10, d = 20;
  swap(c, d);
  cout << " c = " << c << " d = " << d << endl;
}

这里两个 swap重名 是没有问题的 这个是 c++ 中的函数的重载  两个函数函数名相同 参数的数量,类型,类型的顺序不同 那么他们在一个作用域中是可以同时存在的

还有几个要注意的点:

  1. 我们的引用在定义的时候必须初始化 不能先定义 后面再初始化
  2. 一个变量可以有多个引用 就像我们的第一张图片 b c d都是a的引用
  3. 引用一旦引用一个实体,就不能够引用其他的实体了
  1. 不能给常量取别名 除非加const修饰

关于第三个点 大家来看这张图片看看是什么意思?

b1d4059a99cd41f690771b843856468c.png

大家 觉得这里的 c=d 是什么意思呢  是变更 c 引用的量 还是给 c 赋值呢?

其实第三个特性已经很显然了 我们引用完一个实体就不能再取引用其他的实体了(好像物品们不能拿 甲同学 的外号 去叫 乙同学)  所以这里的答案就必然是赋值了

a62a09ea1e2945d79d53fd8386154ca6.png

注意:C语言中的指针是可以改变所指向的对象 初始化后 还可以更改


当然我们的引用也是可以用到 const 的 大家看一下这下面的几种情况

    const int a = 10;
  int& b = a;
  const int a = 10;
  const int& b = a;
  int a = 10;
  const int& b= a;

大家觉得这里面的代码 那些是不可行的呢? 其实很显然就是一个肯定是不行的 !!

因为 我们对一个变量取别名  别名相对于原引用变量的权限是只能 缩小 不能够 放大 的

像这里的const就是一个减少权限的操作  被const修饰下的变量就变成只读 不能修改了(如果是一个变量有多个指针或者是多个引用 其中一个被const修饰 也仅仅只能代表我们不能通过这个被修饰的指针或引用来改变这个变量 其他的指针或引用还是可以改变他的)

    double a = 3.333;
  int b = a;
  double a = 3.333;
  int& b = a;
  double a = 3.333;
  const int& b = a;

大家看这几个代码有问题嘛?

第一个: 我们知道C语言里面中 如果两个类型不同的变量赋值是会发生 隐形转换 的  此时的a 其实并不是直接就把值给过去的 首先 a 会把它的浮点数部分丢掉后 把剩余的部分给到一个临时变量中 再从这个临时变量把值赋给b

第二个: 我们的引用的初始化的时候 如果遇到这种情况一样也是会产生一个 临时变量 而不能直接把 b 作为 a 的引用是因为 临时变量是具有常性的(被const修饰) 我们一个权限小的怎么能赋值给一个权限更大的变量呢?

71e7141756a64e71959e20f1253b2f65.png注意:这是一个很重要的点 临时变量是具有 常性 的就相当于是这个临时变量是被 const 修饰过的

所以我们的第三个代码就是正确的 那有的人就会问了“为什么引用的部分初始化遇到有临时变量 要用const修饰  可是我们的 int b=a 不用这样修饰呢?”

首先对于这种赋值的操作只有使用 引用和指针 时 一个变量的改变才会影响到另一个变量  而对于这种平常的变量赋值是不需要的  在这里 我们的 变量的值赋值给了b 那么b的改变会影响我们的临时变量嘛 他们是拷贝的关系阿 是不会有影响的


此时我们再来看我们的第三个代码 那么此时我们的 b 就是 临时变量 的 别名 了!!!那么此时我们这个临时变量的生命周期就跟着 b 走了

目录
相关文章
|
3月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
47 0
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
11月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1225 100
|
11月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
1085 179
|
7月前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
7月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
7月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
10月前
|
消息中间件 存储 安全