C++ 类型别名为指针类型时,const的修饰情况
如果类型别名指代的是复合类型,那么把它用到声明语句中产生的效果会和预想的不一样(预想的就是把别名替换为所指代的内容,再判断其数据类型)。
使用typedef
typedef char * pstring;
pstring a = 0;
const pstring cstr = 0;
const char * cstr1 = 0;
const pstring *ps = 0;
const char ** ps1 = 0;
a
的类型为char *
,很自然,因为声明时只用到了别名。- 分析
cstr1
,从对象往指针分析:首先是常量char,然后是指针。 - 分析
cstr
,与cstr1
的区别只是使用了别名,但效果和预想的不一样。从对象往指针分析:首先是char,然后是常量指针。 - 分析
ps1
,从对象往指针分析:首先是常量char,然后是一级指针,然后是二级指针。 - 分析
ps
,与ps1
的区别只是使用了别名,但效果和预想的不一样。从对象往指针分析:首先是char,然后是一级常量指针,然后是二级指针。
总结:const会直接修饰到类型别名指代的指针上去,而不会修饰到底层的对象本身上去。
使用using
将第一句替换为using pstring = char*
,和上面效果是一样的。
使用define
因为define只是简单的宏文本替换,所以这里的效果肯定会和预想的一样了。
但需要注意下面这个坑:(在一条语句中定义多个变量,符号&和*只属于某个声明符,而非数据类型的一部分)
#define ptype int*;
ptype p1,p2; // 即int* p1, p2; p1为指针,p2是个int值
typedef int* p
ptype p1,p2; //即int* p1, int*p2; p1, p2都是指针
const与define的组合效果就不试了。