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 走了

目录
相关文章
|
2月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
51 2
|
2月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
49 0
|
10天前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
27 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
2天前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
9 1
|
1月前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
2月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
46 1
|
21天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
33 0
|
2月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
2月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
27 5
|
2月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
51 4
下一篇
无影云桌面