C++ 中复杂的声明
1、方法也是有类型的,方法的类型由返回类型和形参表决定。比如int F (int)的类型就是去掉方法名,int (int)。
2、对于方法类型,在返回类型和形参表之间,加上一个名称F,就表示一个特定的方法F。
3、思考,如果我在返回类型和形参表之间,加上一个指针变量呢?
表示指向这一类方法的指针。即int (*P) (int),需要特别注意的是,必须使用括号把*P括起来。如果没有括起来,int *P(int),从编译器的角度理解,就变成了返回int指针的方法声明。
4、那么接着思考,方法指针也是指针,既然方法能够返回其他指针,当然也可以返回方法指针。
方法指针的类型就是去掉指针名称,int(*)(int)。从人的角度思考,返回方法指针的方法应该是 int(*)(int) H(int)。但是,我们应该从编译器的角度思考,编译器首先找到方法名,去掉方法名和形参表,剩下的就是返回类型了。因此,实际的写法是int (* H(int)) (int)。
为了便以理解,使用
typedef int(*PF)(int);
PF H (int)。
5、接着考虑,方法指针数组的声明,从人的角度思考,应该是int(*) (int) a[10]; 实际上是 int(* a[10])(int)。
6、接着考虑,指向数组的指针,从人的角度思考,应该是int[10] *p; 实际上是int (*p)[10]。
7、可以认为,编译器并不是从左到右读取声明,而是声明的对象放在了中间,并用括号括起来,保证优先级最高,去掉名称,剩下的就是类型。
8、特别注意,复杂的声明是非常糟糕的编码风格,严重影响代码的可读性,应该尽量避免,可以使用typedef。
转载于:https://www.cnblogs.com/nzbbody/p/3560062.html
C++ 中复杂的声明相关推荐
- c语言中很多中括号由外向里,浅谈C语言中的类型声明
文章目录 [隐藏] 新年第一更!之前群友问了一个 C语言 问题,即int(*(*p)()).int *(*p)()和int *(*p())的区别在哪里.确实,有时C语言的类型声明是很魔性的,看着也很令 ...
- [转] SQL Server中变量的声明和使用方法
原文地址 SQL Server中变量的声明和使用方法 声明局部变量语法: DECLARE @variable_name DataType 其中 variable_name为局部变量的名称,DataTy ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,终于把心中的疑惑彻底解开了.现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 类中成员函数声明后面的const的含义
这个const一般是对类中成员函数属性的声明,但这个声明怪怪的,只能放在函数声明的尾部,大概是因为其它地方都已经被占用了.这个声明表示这个函数不会修改类中的任何数据成员.如果在编写const成员函数时 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
- php中函数声明的方法,PHP中的函数声明与使用
函数 1. 函数名是标识符之一,只能有字母数字下划线,开头不能是数字: 函数名的命名,必须符合"小驼峰法则"FUNC(),func(),Func(); 函数名不区分大小写; 函数 ...
- 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)
变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...
- C++ 在派生类中使用using声明改变基类成员的可访问性
通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) .using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决 ...
- 关于某些同行盗用“jeecg”关键词在百度竞价中推广的声明
关于某些同行盗用"jeecg"关键词在百度竞价中推广的声明 近段时间以来,我司发现有某些同行企业借助"jeecg"品牌的知名度,盗用"jeecg&qu ...
- ES5和ES6中的变量声明提升
ES5和ES6中的变量声明提升 Example1: a=2; var a; console.log( a ); //结果为2 Example2: console.log( a ); //结果是unde ...
最新文章
- AI产品经理必修——揭开算法的面纱(余弦定理)
- Java算法练习——正则表达式匹配
- 云计算对中小企业的大冲击
- saltstack批量修改root密码
- 源 arm_arm和X86处理器性能简单测试
- 按钮点击_如何设置微信小程序按钮点击事件?
- html留言回复评论页面模板,HTML5实现留言和回复的页面样式
- python仿真搭建_mock搭建——python——搭建一个简单的mock服务——简单版本
- 《暖冬里的事儿 ——春假散札》
- java 文件md5校验_Java 自带MD5 校验文件
- 拉格朗日方程的三种推导方法之基于汉密顿原理推导
- 微信订阅号之——网页授权
- 敏捷下的scrim、xp、3355、TDD、BDD、CI、DI及四个仪式、十二原则汇总
- Vuforia开发问题记录(四)------- Vuforia AR项目在小米8 SE上运行黑屏
- springbooot学习记录
- 58同城亿级流量架构演进
- ECC功能简述及其原理
- 我的世界服务器java进不去_萌新求助 mc服务器进不去
- 大龄计算机考研 考研帮,过了40还想考研吗?大龄研究生讲述真实感受
- 华为linux改ip地址,ubuntu9.10校园网上网配置详细教程(华为h3c,mac地址绑定)
热门文章
- 你真的懂点击率(CTR)建模吗?
- spd耗材管理流程图_国药器械山东公司助力济宁医学院附属医院SPD项目成功启动...
- oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表
- Java show两个整数加减_怎么样用java编写界面实现两个数的加法运算
- mysql添加外键约束失败cannot add foreign key constraint
- linux应用之--网络编程
- 玩转mini2440开发板之【如何设置开发板的网络参数】
- [机器学习]超参数优化算法-SuccessiveHalving与Hyperband
- C++中const迭代器 和 const_iterator的区别
- windows中 修改某种文件图标 的方法 (备忘)