简单运用typeid搞清C++ 声明时 *[]const& 的作用方式

声明中 *[]& 操作符 和 const关键字的组合总是容易令人混淆。

下面就来介绍一种简单的方法搞清他们的作用关系。

首先我们需要包含头文件typeinfo

#include <typeinfo>

现在我们就可以调用函数 typeid(expression).name( ) 输出所声明的对象类型啦

int x;

cout << typeid(x).name() << endl;

输出:

i                 // 所以这里就表示我们的x是int类型变量

int &y = x;

cout << typeid(y).name() << endl;

输出:

i

int const &y = x;

cout << typeid(y).name() << endl;

输出:

i

所以从某种意义上可以说变量的类型始终没有发生改变

(或是理解为变量本身的const/&会被typeid忽略了,详见《C++primer》2.4.3节)

我们可以简单将y视作x使用。

只是当有const关键字时,y无法再被赋值了

(个人不太建议用"常指针"这种容易混乱的说法)

(并且在使用&作为引用声明时,无论有什么其他符号,&始终需要紧贴变量名,否则报错。记住这种唯一用法即可。)

接下来我们来看 * 和const的组合:

int* x;

cout << typeid(x).name() << endl;

输出:

Pi

int* const x;

cout << typeid(x).name() << endl;

输出:

Pi                 // 类型不变,仍为int指针

const int* x;

cout << typeid(x).name() << endl;

输出:

PKi                 // 类型变了

//(字母缩写可视为pointer(P) const(K) int(i) ,其中第一个字母为主要类型

这时候指针指向的对象就是 const int 类型了

最后,我想让一个指针指向一个数组:

int m[3][2] ;

int* n[3][2];

cout << typeid(m).name() << endl << typeid(n) << endl;

输出:

A3_A2_i

A3_A2_Pi                 // 可以看作三行二列 int指针 的 数组,不是我想要的结果

让我们再来看看&m的类型:

cout << typeid(&m).name() << endl;

输出:

PA3_A2_i

将之前的声明改正:

int (*n)[3][2];

输出:

PA3_A2_i                 // 可以看作三行二列int 的 指针

这可以用运算符的优先级来进行思考:

[]优先级最高,与变量名结合后即变成数组类型。

而如果用括号让*与变量名先结合,即可作为指针类型。

n = &m;

编译通过,这时候就可以将&m赋值给n了,成功!

注:typeid的输出是非标准化的,精确类型还需要配合demangler判别(待续)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值