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。
C++ 中复杂的声明的更多相关文章
- C#中方法的声明
C#中方法的声明(四要素) 访问修饰符 :public,private(方法的默认访问修饰符) 返回值类型:void 和 非void 方法名称 : 规范是方法名称取动词,每个单词的首字母大写. ...
- FUNCS.H中的函数声明
/*************************************************************************** ...
- 【JavaScript】Javascript中的函数声明和函数表达式
Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, ...
- PHP中的函数声明与使用
函数 1. 函数名是标识符之一,只能有字母数字下划线,开头不能是数字: 函数名的命名,必须符合&quo ...
- c++中的前置声明
引用google c++编码规范: When you include a header file you introduce a dependency that will cause your cod ...
- C++中的inline声明
C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(i ...
- C++/CLI中class成员声明与实现分开在不同文件时必须添加namespace
以下是我的代码: //TaskConfigFile.h #pragma once using namespace System::Collections::Generic; using namespa ...
- es6中的变量声明
目录 es6中的变量声明 变量的声明 es6中的变量声明 变量的声明 for (var i = 0; i < 5; i++) { console.log(i) } var声明 作用域问题 上面的 ...
- js中变量的声明
大家都知道js中变量的声明是要提前的,下面有4个样例: 1.if(!"t" in window){ var t = 1; } alert(t);答案是undefine ...
- [转] SQL Server中变量的声明和使用方法
原文地址 SQL Server中变量的声明和使用方法 声明局部变量语法: DECLARE @variable_name DataType 其中 variable_name为局部变量的名称,DataTy ...
随机推荐
- GreenDao官方文档翻译(上)
笔记摘要: 上一篇博客简单介绍了SQLite和GreenDao的比较,后来说要详细介绍下GreenDao的使用,这里就贴出本人自己根据官网的文档进行翻译的文章,这里将所有的文档分成上下两部分翻译,只为 ...
- 【转】Intel HEX介绍
记录格式 Intel HEX由任意数量的十六进制记录组成.每个记录包含5个域,它们按以下格式排列: :llaaaatt[dd...]cc 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数 ...
- C++ Primer学习_第1章
源文件后缀 在大多数的系统中,源文件的名字以一个后缀为结尾,后缀是由一个句点后接一个或多个字符组成的.后缀告诉系统这个文件是一个C++程序.不同编译器使用不同的后缀命名约定,最常见的包括.cc..cx ...
- 《Python核心编程》 第四章 Python对象- 课后习题
练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到. 类型:对象的 ...
- Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)
参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...
- 前言:关于nagios监控
前言,关于nagios监控. 这段时间一直在做关于nagios监控,不停的做实验,从而也忽略了书写这方面,今天写一份安装文档花了四个多小时,看来写文档也是一件很麻烦的事情,不过,做过的事情还是需要留下 ...
- qqmap 的一些操作
; var mapcontorl = "mapContainer"; var fullscreen = false; function qqMap(options) { var t ...
- 【Hadoop代码笔记】Hadoop作业提交之Child启动reduce任务
一.概要描述 在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map任务.接上上篇文章,TaskRunner线程执行中,会构造一个java –D** Child address ...
- 修改MongoDb的 DB 和 Log 存储路径 (Windows)-摘自网络
Create a file called mongod.cfg in MongoDB folder if you dont have it. In my case: C:\Users\ivanbtru ...
- 第二百七十二、三天 how can I 坚持
昨天加班回来都很晚了,也忘了些日志了.其实感觉加班也没什么啊,一个团队在一块说说闹闹,愉快的完成工作挺好. 今天是2015年的最后一天,2015的愿望啊,只怪自己太怂了.不怂会是什么结果. 其实更应该 ...