0
点赞
收藏
分享

微信扫一扫

【C++】关于复合类型的类型别名问题

一条咸鱼的干货 2022-03-10 阅读 84
c++

🌏目录


🤔 类型别名的实现方法

🏷️ 方法一:typedef关键字

typedef int myint;  //myint是类型int的别名
typedef int *pint;  //pint是类型* int的别名
typedef int myint, *pint;  //连写

🏷️ 方法二:using关键字

//C11新标准规定的新方法
using myint = int;  //myint是类型int的别名
using pint = int *;  //pint是类型int *的别名

🤔 复合类型的类型别名

typedef int myint, *pint;
myint r = 1; 
const pint p = &r;
const pint *pp;  //未初始化,所以该指针乱指。每次执行程序` cout<<pp `会发现打印出来的值每次都不一样

1️⃣ 对于const pint p

从右往左读,pint说明p是一个pint类型的对象,const说明p还是一个pint常量。再结合下图👇
在这里插入图片描述

可见,p是一个指向r(int类型)常量指针p自身的值已无法修改,指向固定向r

2️⃣ 对于const pint *pp

从右往左读,*说明pp是一个指针pint说明pp是一个指向pint类型的指针,const说明pp是一个指向pint常量的指针,因此首先可以明确的是,【通过pp无法修改pp所指向的对象的值】。再结合下图👇

在这里插入图片描述

💭 对于这个例子,书上有这样一句话

const pint *pp;  //pp是一个指针,它的对象是   `指向int类型的常量指针`

也就是说,对于上图中间的这个<未命名>对象,它是一个指向int类型的常量指针,它自身的值无法被更改。为什么说中间这个<未命名>对象是一个常量指针呢?

🥦 思考如下

由于pp未初始化,因此对于中间这个<未命名>对象,只能有一种途径来访问读取和修改它——通过pp。然而pp是一个指向常量的指针,只有访问读取的权利,没有修改的权力。也就是说,我们【没有途径】能够【修改】中间这个<未命名>的对象,因此它也就成了某种意义上的【常量】。所以上面代码的这句注释pp是一个指针,它的对象是 指向int类型的常量指针有一定合理性。

🥦 附加思考

如果对指针pp进行初始化👇

typedef int myint, *pint;
myint r = 1; 
pint p = &r;
const pint *pp = &p;  //已初始化

此时上图应变成👇

在这里插入图片描述
此时,就不能再说pp指针所指向的对象是一个指向int类型的常量指针,而应该说,pp指针所指向的对象是一个指向int类型的普通指针


举报

相关推荐

0 条评论