C++ 理解复杂声明
一句话
由内而外,先右后左,从抽象到具体!
第一个例子
int *a[10];
提问:a是啥??
第一步: int *a[10];
从a开始,由内而外开始解释。先右后左,所以先看[10],说明a是元素数为10的数组!
第一步我们就抓住了a的本质!a就是一个数组。知道了它是数组,我们就知道它支持下标访问等。这就是这个方法的好处,先抓住大体,在深究细节!
要知道数组里装的是啥,就继续看。
第二步: int *a[10]
右边看完了,那就看左边,看到*,说明数组里装的是指针!
要知道指针指的啥,就继续向左看。
第三步: int* a[10]
看到int,说明指针指向的是int!
所以综合起来,a就是个数组,数组里装的是指针,指针指向int,简称int指针数组!
相信这个简单的例子已经让大家有点感觉了,我们再举个复杂的例子。
第二个例子
using func_t = int (*())();
提问:func_t 是啥??
这次没有a了,不慌,我们还是按照从内而外的原则,从最里面开始!
问题来了,“最里面”是
int (*(这里))();
还是
int (*这里())(); ?
这里说明一下,里面没东西的()永远都解释成函数的参数列表,而不是一个冗余的括号!所以:
int (*这里())();
才是最里面!!
找到了“最里面”,我们还是按照套路来。由于这次没有标识符,我们把暂且func_t塞到最里面的位置占个位:
int (*func_t())();
第一步:先右后左原则,看括号。
int (*func_t())();
说明func_t就是个函数!参数列表为空。函数的返回值是什么?继续看。
第二步:有括号先看括号内的。括号里面右边看完了,我们转到左边,发现有个指针。
int (*func_t())();
说明函数的返回值是指针!指针指向什么?继续看。
第三步:int (*func_t())();
括号内的看完了,继续先右后左,这次右边是括号,说明指针指向的是函数!函数的返回值是什么?
第四步:int (*func_t())();
没错,就是int!
综合起来,func_t 是个函数,函数的返回值是 函数指针!