声明中 *[]& 操作符 和 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判别(待续)