百度没有收录网站,wordpress动漫连载模板,花多少钱能把网站做到页面,嘉定华亭网站建设#x1f64b;本文主要讲讲C的引用 是基础入门篇~ 本文是阅读C Primer 第五版的笔记 #x1f308; 关于引用 几个比较重要的点 #x1f33f;引用相当于为一个已经存在的对象所起的另外一个名字 #x1f31e; 定义引用时#xff0c;程序把引用和它的初始值绑定#xff08;b…本文主要讲讲C的引用 是基础入门篇~ 本文是阅读C Primer 第五版的笔记 关于引用 几个比较重要的点 引用相当于为一个已经存在的对象所起的另外一个名字 定义引用时程序把引用和它的初始值绑定bind在一起而不是将初始值拷贝给引用。一旦初始化完成引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象因此引用必须初始化 另外要注意 类型不能混用 相信看完后 你会有所收获~ C 引用
C11中新增了一种引用:所谓的**“右值引用(rvalue reference)”,我们将在13.6.1节(第471页)做更详细的介绍。这种引用主要用于内置类**。严格来说,当我们使用术语“引用reference)”时指的其实是“左值引用Ivaluereference)”。
引用reference为对象起了另外一个名字引用类型引用(refers to)另外一种类型。通过将声明符写成d的形式来定义引用类型其中d是声明的变量名:
int ival 1024;
int refVal ival;
// refVal 指向ival是ival的另一个名字)
int refVal2;
//报错:引用必须被初始化一般在初始化变量时初始值会被拷贝到新建的对象中。然而定义引用时程序把引用和它的初始值绑定bind在一起而不是将初始值拷贝给引用。一旦初始化完成引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象因此引用必须初始化。
引用并非对象相反的它只是为一个已经存在的对象所起的另外一个名字。
定义了一个引用之后对其进行的所有操作都是在与之绑定的对象上进行的:
refval 2;
//把2赋给refVal指向的对象此处即是赋给了ival
int ii refval;//与ii ival执行结果一样为引用赋值实际上是把值赋给了与引用绑定的对象。获取引用的值实际上是获取了与引用绑定的对象的值。同理以引用作为初始值实际上是以与引用绑定的对象作为初始值:
//正确: refval3绑定到了那个与refval绑定的对象上这里就是绑定到ival上
int refVal3 refVal;
//利用与refval绑定的对象的值初始化变量i
int i refval; //正确:i被初始化为ival的值因为引用本身不是一个对象所以不能定义引用的引用。
引用的定义
允许在一条语句中定义多个引用其中每个引用标识符都必须以符号开头:
int i 1024,i2 2048;// i和i2都是int
int r i, r2 i2; // r是一个引用与i绑定在一起r2是int
int i3 1024, ri i3;// i3是int,ri是一个引用与i3绑定在一起
int r3 i3,r4 i2; // r3和r4都是引用除了2.4.1节第55页和15.2.3节(第534页将要介绍的两种例外情况其他所有引用的类型都要和与之绑定的对象严格匹配。而且引用只能绑定在对象上而不能与字面值或某个表达式的计算结果绑定在一起相关原因将在2.4.1节详述:
int refVal4 10;
//错误:引用类型的初始值必须是一个对象
double dval 3.14;
int refVal5 dval;
//错误:此处引用类型的初始值必须是int型对象练习 下面是几个练习 可以检验一下学习成果~
//练习2.15:下面的哪个定义是不合法的?为什么?
(a)int ival 1.01;
(b) int rval1 1.
(c)int rval2 ival;
(d) int rval3;//练习2.16:考查下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?
int i 0,rl i;
double d 0,r2d;
(a) r2 3.14159;
(b)r2 rl;
(c) i r2;
(d)rl d;//练习2.17:执行下面的代码段将输出什么结果?
int i, ri i;
i 5; ri 10;
std::cout i ri std::endl;答案答案~ 1️⃣练习2.15:下面的哪个定义是不合法的?为什么?
(a) int ival 1.01; 是不合法的。因为int类型只能存储整数不能存储浮点数1.01。
(b) int rval1 1; 是不合法的。因为1是一个字面量它代表了整数1但字面量不能被直接赋值给引用。而且引用的定义需要一个已存在的变量作为其目标。
(c ) int rval2 ival; 是合法的假设ival已经正确定义并且是一个int类型的变量。
(d) int rval3; 是合法的但rval3未被初始化它将包含未定义的值。
2️⃣练习2.16:考查下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?
(a) r2 3.14159; 是合法的。它将double类型的字面量3.14159赋值给r2r2是一个double类型的引用。
(b) r2 rl; 是不合法的。因为rl是一个int类型的引用而r2是一个double类型的引用。类型不匹配。
(c )i r2; 是不合法的。因为i是一个int类型的变量而r2是一个double类型的引用。尝试将一个double类型的值赋给一个int类型的变量会导致数据丢失。
(d) rl d; 是合法的但可能导致数据丢失。因为rl是一个int类型的引用而d是一个double类型的值。int类型不能准确表示double类型的值所以只有d的整数部分会被存储在rl指向的int类型变量中。
3️⃣ 练习2.17:执行下面的代码段将输出什么结果?
虽然i的值被5所赋值随后ri被赋值为10但std::cout会输出i和ri当前的值不是所赋的值此时i由于ri的赋值操作而覆盖了原本的值ri输出为10。引用只是为其他变量提供了一个别名并不复制原变量的值。所以i也是10 ok 完结~ ~ 有帮助点个赞叭~