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;

C++ 类型别名为指针类型时,const的修饰情况_第1张图片

  1. a的类型为char *,很自然,因为声明时只用到了别名。
  2. 分析cstr1,从对象往指针分析:首先是常量char,然后是指针。
  3. 分析cstr,与cstr1的区别只是使用了别名,但效果和预想的不一样。从对象往指针分析:首先是char,然后是常量指针。
  4. 分析ps1,从对象往指针分析:首先是常量char,然后是一级指针,然后是二级指针。
  5. 分析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的组合效果就不试了。

你可能感兴趣的:(C++)