| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++入门基础(下) -> 正文阅读 |
|
[C++知识库]C++入门基础(下) |
引用引用概念
一个人可以有多种称呼 比如:李逵 ,在家被称为“铁牛”,在江湖上被称为:”黑旋风“. 但无论哪一种称呼都是指李逵本身这个人. 用法如下:
举个例子: 输入以下代码:
注意:引用类型必须和实体类型是同种类型的. 我们看输出结果: 它们的地址一样,说明它们确实指向了同一块内存空间,内容相同. 所以说如果改变ra的值,a的值也会随之改变. 引用特性
我们逐个来解释说明. 1.引用在定义时必须初始化我们平常定义变量的时候,例如int a;char c;int* p...等等,都可以不用初始化,就是说不用给初值,但是引用初始化必须给初值.
2.一个变量可以有多个引用意思是一个人可以有多个外号,就像上面举的那个例子. 变量也是同样的道理,一个变量可以有多个别名.
输出结果如下: 3.引用一旦引用一个实体,再不能引用其他实体.这个意思是比如你给李逵起了一个黑旋风的外号,这个外号以后就只能属于李逵他自己了,不能再把黑旋风这个外号给别人. 例如有两个变量a和变量b,我们给a起一个别名是ra,这个时候你就不能再把ra这个外号给b了.
常引用这里会涉及一些权限的平移、放大与缩小问题. 我们知道,被const修饰的变量不可以被修改,相当于变成了只读权限了,不可以被写了.相当于权限变小了. 而我们平常不被const修饰的变量,既可以被修改,也可以被读取。所以它的权限比较大. 权限只可以被缩小和平移,不可以被放大!!! 这里还需要补充一点:在我们发生类型转化的时候,比如 int b = 0;double a = b; 编译器会先产生b的一份临时拷贝tmp(通过整型提升,类型为double),而临时常量具有常性,相当于tmp的类型为const double,再将tmp的值赋值给a.
使用场景1.作为参数使用
因为参数是引用,所以他就是相当于实参的别名,所以如果交换,就切切实实交换了两个实参的值,而不是形参. 2.作为返回值使用传引用返回:实质上是返回返回对象的别名
对于静态或全局变量,返回值可以用引用作为返回值,直接返回它本身,而不用再产生一份拷贝了. 但若不是全局变量会出现什么问题呢?
先来看结果: 有的同学就说了,这是1啊,没有问题啊. 其实这是一种侥幸,进入函数之后,n++,此时n变成1.返回n的别名给ret 但仔细想一下,当把n的别名给ret的时候,是不是函数已经结束了!函数结束是不是临时变量就被回收了! 但是为什么结果是1呢? 因为此时编译器还没有清理或者修改增加别的新的内容.?里面的内容依然是1. 我们拿个例子来解释一下:你去住酒店,要住一晚上,然后第二天走了之后发现你的钱包和一些东西落在里面了,这个时候你赶紧返回去拿,发现钱包什么的都还在,你就拿到了它.这就是侥幸. 如果其中来了其他人或者保洁阿姨清理了这些东西呢?这个时候你也就拿不到了,所以说刚才编译器那次拿到这个1也是“侥幸”. 那么这次就没这么”侥幸“了.
我们来看输出结果: 诶?ret不是Add(1,2),是1和2相加结果不应该是3吗?怎么会是7呢? 这次就没这么侥幸了. 首先第一次Add(1,2)返回了3,即把这个3留在了酒店.但此时3的主人已经走了. 后面又来了一个Add(3,4)即7,替代了这个3 这个时候3的主人回来再取,取到的已经不是原来它的东西了,只能是7了.这就造成了错误. 所以注意:
引用和指针的区别
内联函数内联函数的概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,从而不会有函数压栈的开销,提高运行效率. 看下图: 在Debug模式下,我们转到反汇编来看一下 ?可以看到call这个命令,这个其实就是在调用函数,说明此时并没有展开. 在Release模式下我们再试一下: ?可以发现Add函数被展开了,并没有call函数.直接进行相加操作了. 内联函数特性
下面这段代码演示了这个定义与声明分离的问题:
所以最好声明和定义写在一起. 宏的优缺点
auto关键字auto简介
总而言之就是:auto会自动推导变量的类型,而不用自己手动去写.通常类型名较长的时候用auto替代(或者自己也不知道变量是什么类型(doge)) 看以下代码:
运行结果如下: 可以看到auto已经成功推导出来了变量的类型.? 需要注意的是: 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型 auto使用的细则1. auto与指针和引用结合起来使用 可以看到,无论auto加不加*,对于指针类型,结果都是一样的. 但引用必须加上& ?2. 在同一行定义多个变量 ?可以看到同一行类型不同并不能编译通过. auto不能使用的场景1.auto不能作为函数的参数
2. auto不能直接用来声明数组 3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法 基于范围的for循环语法如果想要遍历一个数组,我们有以下两种方式
可以改为以下代码:
是不是非常简便.
使用条件1. for循环迭代的范围必须是确定的
2. 迭代的对象要实现++和==的操作。(关于迭代器这个问题,以后我会说明,现在大家了解一下就可以了) 指针空值nullptrC++98中的指针空值在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如
需要注意的是:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 12:33:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |