因为昨天看了c++ primer里面介绍复合类型的部分,觉得写得很透彻,所有决定今天来记录一下自己的理解。
常见的复合类型主要是引用和指针,对应的声明修饰符分别是 & 和 * 。其实所谓复合类型就是一个基本类型加上一组修饰符(这句话后面慢慢理解)。
- 引用
在使用引用的时候,一般只需要记住它是对象的别名就好了(为什么说是一般,下面会介绍decltype())。还有一点需要记住的就是引用不是对象,所有没有引用的引用。
1. 引用的定义
1 int i = 0; 2 int &ci = i; //ci 是 i 的别名,访问 ci 就是访问 i ,修改 ci 就是 修改 i ,用 ci 就是用 i
上面的定义指出了: ci 的基本类型是int,声明修饰符是&,所以它就是一个int型的引用。其实相当于就是一个声明符就是一个“的”(等看完声明符,再解释这句话)。
这里有一点需要注意的是,一般初始化引用不能用字面值(什么是字面值?就是想23,56这样的数字,‘’123‘这样的字符串常量)。
1 int & m = 32; //错误,后面会讲为什么 2 int *&n = “12”; //错误,原因跟上面一样,其实就是非常量的引用 引用了 常量
- 指针
想学好指针,只需要分清 *p、p 、&p 各自代表的意思和值就好了(&p的值一般来说只有看到定义之后结合栈才会知道,有兴趣去看看计算机原理,这里它的值不做要求,
知道含义就可以了)。指针出错往往就是这个分不清跟野指针。
1. 指针的定义
1 int i; 2 int *p = &i; //指针就是保存对象地址的变量
这里就不介绍 * 和 & 作为操作符的用法了。* 和 & 可以用作操作符,也可以是声明修饰符,具体是哪种情况需要根据上下文环境确定首先 p 的基本类型是int型,声明修饰符 * 代表指针,所以
p 是一个int型的指针。对这句话:一个声明符就是一个“的”,有没有一点感觉了?下面接着看:
1 char *s = "adb"; //s是一个char型的指针 2 char *&si = s; //si是一个char型的指针的引用
首先 s 就不说了,跟 p 是一样的。我们来看 si 的基本类型还是char型,第一个修饰符 * 代表指针,第二个修饰符 & 代表引用,所以 si 就是char型的指针的引用。有没有发现还有一句话,也
在这里体现了,就是“复合类型就是一个基本类型加上一组修饰符”,si 就是一个很好的列子。还有就是指针的指针也可以这样分析。
- 常X const
到这里,基本的复合类型我觉得就ok了。这里主要在介绍一个限定符--const。限定符const就是限定这个变量可以执行的操作(+、-、*、/、++之类)。
1. 定义常量
1 const int i = 0; //定义了一个常量 i 2 i=9; //错误,不能修改常量值
所谓常量就是说,本身值不能修改,一改就会出错。所以常量在定义的时候一定要初始化,否则就会出错。这里初始化,不一定要用字面值,可以用变量初始化 int i = 0; const int i = a;
这样也是可以的。
2. const 引用
用弄清这一点,应该只用记住两点就可以了:首先非const的引用 只能引用 非const的变量(也就是非不引常),或者是用非const的对象、引用初始化;其次const引用 可以引用 非const对象、
非const引用、const变量(也就是说所有const type声明的变量)、字面值,可以用以上变量、引用、字面值来初始化。
1 int i = 0; //正确 2 const int j = 0; //正确 3 int &m = i; //正确 4 const int &n = j; //正确 5 int &k = n //错误,非不引常
这里有一点指定说一下就是const引用 引用的变量是可以修改的,只是不能通过该引用自身修改。有点绕,来看个具体的例子:
int i = 0; const int &bi = i; int &ci = i; // bi 和 ci 同时引用了i; bi = 8; //错误,不能改 ci = 7; //正确
正确的代码修改后,i 和 bi 和 ci 的值都是7;
- 指针和const
在说这个之前,我还是要提一下刚刚体会的那两句话,可能会帮助理解。
还有一点要明确,const除了是限定符,也可以是修饰符(不知道对不对,但是这样好理解)。
清楚了这两点之后,直接来看一个最复杂的例子(主要是我没耐心了...哈哈哈)
const double i = 2.2; const double *const ci = i;
首先来看 ci 的开头不是一个基本类型,而是const限定符,表示这个指针指向一个const变量(常量),基本类型是一个被const限定的double型(也就是不能改的double型--double常量型),
第一个限定修饰符 * 代表指针,第二个限定修饰符const代表常量,所以 ci 就是一个const double型的指针常量。简单来说就是第一个const表示指向常量(通常这种指针可以说成是底层const),
第二个const表示这个指针是一个常量,其中存放的地址值不能改。
差不多就这些了,其他的可以上机自己实现理解下,不能理解的话,评论区走一走。
原文链接: https://www.cnblogs.com/hml-xxbj/p/9789209.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/283156
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!