函数-C++的编程模块

   1、C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数、浮点数、指针,甚至可以是结构和对象(有趣的是,虽然C++函数不能直接返回数组,但可以将数组作为结构或者对象的组成部分来返回)。

  2、函数时如何返回值的?通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。随后,调用程序间查看该内存单元。函数原型将返回值类型告知调用程序。

  3、为什么需要函数原型?原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有的话)以及参数的类型和数量告诉编译器。原型可以帮助编译器完成许多工作,它们可以极大地降低程序的出错几率。具体来说,原型可以确保以下几点:

  ①编译器正确处理函数返回值。

  ②编译器检查使用的参数数目是否正确。

  ③编译器检查使用的参数类型是否正确。如果不正确,则转换成正确的类型。

  ④通常,原型自动将传递的参数强制转换成为期望的类型。

  4、在编译阶段进行的原型化被称为静态检查。可以看出,静态类型检查可以捕获许多在运行阶段难以捕获的错误。

  5、通常,在函数原型参数列表中,可以包括变量名,也可以不包括。

  6、避免使用函数原型的唯一方法是,在首次使用函数之前定义它,但这并不总是可行的。

  7、C++将数组名解释为其第一个元素的地址。这一规则有两种例外的情况:第一种是数组声明使用数组名来标记存储位置;第二种是对数组名使用sizeof()将得到整个数组的长度(以字节为单位)。

  8、在C++中,当且仅当用于函数头或函数原型中,int *arr和int arr[]的含义才是相同的。它们都意味着arr是一个指针。不过数组表示法提醒我们,arr不仅指向int,还指向int数组的第一个int。

  9、两个恒等式:arr[i]==*(arr+i) 和 &arr[i]==arr+i。对于遍历数组而言,使用指针加法和数组下标是等效的。

  10、接受数组名的函数将使用原始数据,为防止函数无意中修改数组的内容,可在声明形参时使用关键字const。

  11、当用cin读取缓存中的输入时,非法输入将设置一个错误条件,禁止进一步读取输入。如果程序在输入循环后还需要进行输入,则必须使用cin.clear()重置输入,然后还可能需要通过读取不合法的输入来丢弃它们。具体过程如下:

  if(!cin)  // bad input

  {

    cin.clear(); // 清空缓冲区

    while(cin.get()!='\n') // 丢弃不合法的输入

      continue;

  }

  12、将const用于指针有两种方式:第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。顺口溜:左定值,右定向

  ①指向常量的指针:int age=30;const int *pt=&age;pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。可以直接通过age这个变量来修改age的值,但不能使用pt指针来修改它。可以修改pt的值,使pt指向另一个位置。

  ②将指针声明为常量:int sloth=3;int * const finger=&sloth;这种声明格式使得figer只能指向sloth,但允许使用figer来修改sloth的值。

  13、将const变量的地址赋给指向const的指针:const float a=9.80;const float * pe=&a;   // VALID

    将const变量的地址赋给常规指针: const float b=9.80; float * pm=&b;   // INVALID   如果非要这么做,可以使用强制类型转换(const_cast).

  14、如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针!

  15、在函数中,将指针参数声明为指向常量数据的指针有两条理由:

    ①可以避免由于无意间修改数据而导致的编程错误。

    ②使用const使得函数能够处理const和非const实参,否则只能接受非const数据。

  16、将二维数组名作为实参传递时,函数头或者函数原型的形参有两种格式,例如:int (*ar2)[4] 和 int ar2[][4]。 这两种方式都指出,ar2时指针而不是数组。而且指针类型指定了列数,所以函数只能接受4列组成的数组,而对数组的行数没有限制。

  17、假设要将字符串作为参数传递给函数,则表示字符串的方式有3种:①char数组: char a[3]={'a','b','\0'};如果没有'\0',则不是字符串,只是一个数组 ② 用双引号括起的字符串常量:char a[3]="ab"; ③ 被设置为字符串的地址的char指针: char a*="abc"。它们的类型都是char*。

  18、将字符串作为参数传递,实际传递的是字符串的第一个字符的地址。这意味着字符串函数原型应将其表示字符串的形参声明为char*类型。

  19、函数中可以按值传递结构,就像普通变量那样,也可以传递结构指针,如果结构非常大,则传递结构指针的效率将更高,同时函数能够使用原始数据。函数也可以返回结构。

  20、函数名即为函数的地址。

  21、函数指针的声明:double pam(int);// 函数原型 则函数指针声明为:double (*pf) (int);即将pam替换为(*pf)。由于pam是函数,因此(*pf)也是函数。正确的声明pf后,便可以将相应函数的地址赋给它:

  double pam(int);

  double (*pf) (int);

  pf=pam;

  22、使用指针调用函数:

  double pam(int);

  double (*pf) (int);

  pf=pam;

  double x=pam(4);

  double y=(*pf)(5);或者double y=pf(5);

《C++ Primer Plus》读书笔记之五—函数-C++的编程模块的更多相关文章

  1. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

  2. C++ Primer Plus读书笔记

    第五章 循环和关系表达式 1. 2.类别别名: (1)   #define FLOAT_POINTER float * FLOAT_POINTER pa, pb; 预处理器置换将该声明转换成  flo ...

  3. 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行

    搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...

  4. 《C#图解教程》读书笔记之五:委托和事件

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执 ...

  5. C语言深度解剖读书笔记(6.函数的核心)

    对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++);  这样的问题大多跟编译器有关,不要去刻意追求 ...

  6. 《C++ Primer》读书笔记 第一章

    读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...

  7. 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记

    函数是C++的编程模块.要使用函数,必须提供定义和原型,并调用该函数.函数定义是实现函数功能的代码:函数原型描述了函数的接口:传递给函数的值的书目和种类以及函数的返回类型.函数调用使得程序将参数传递给 ...

  8. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  9. 《Java并发编程的艺术》读书笔记:一、并发编程的目的与挑战

    发现自己有很多读书笔记了,但是一直都是自己闷头背,没有输出,突然想起还有博客圆这么个好平台给我留着位置,可不能荒废了. 此文读的书是<Jvava并发编程的艺术>,方腾飞等著,非常经典的一本 ...

随机推荐

  1. springMVC流程分析

    下面是DispatcherServlet的doDispatch()方法 protected void doDispatch(HttpServletRequest request, HttpServle ...

  2. 剑指offer(36-40)编程题

    两个链表的第一个公共结点 数字在排序数组中出现的次数 二叉树的深度 平衡二叉树 数组中只出现一次的数字 36.输入两个链表,找出它们的第一个公共结点. class Solution1 { public ...

  3. iOS 性能优化套路

    ***  一级套路 ***  使用ARC管理内存- 防止内存泄露- 保证释放掉不再需要的内存,提高性能 在正确的地方使用 reuseIdentifier平时接触的需要考虑重用的视图有UICollect ...

  4. 深度为君剖析CTO、技术总监、首席架构师的区别

      CTO.技术总监.首席架构师的区别 经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个 ...

  5. JS日期、月份的加减

    JS日期.月份的加减 需要注意的是返回的月份是从0开始计算的,也就是说返回的月份要比实际月份少一个月,因此要相应的加上1 // 日期,在原有日期基础上,增加days天数,默认增加1天 function ...

  6. 第7天:javascript-DOM 获取标签、注册事件改变属性的值、innerText、改变属性的值等

    javascript WEB api------DOM document object model 案例 为元素注册点击事件,弹出对话框 <input type="button&quo ...

  7. ASP.NET页面支持的指令

    页面的处理指令 页面指令的处理用于配置执行该页面的运行时环境.在ASP.NET中,指令可以位于页面的任何位置,但良好且常见的习惯是将其置于文件的开始部分.除此,页面指令的名称是不区分大小写的,且指令的 ...

  8. [javaSE] 数据结构(栈)

    栈(stack)是一种线性存储结构,有以下特点: 1.栈中数据是按照先进后出的方式进出栈的 2.向栈中添加删除元素时,只能从栈顶进行操作 使用数组实现栈 定义一个类ArrayStack 实现入栈方法p ...

  9. 最大子序列和问题--时间复杂度O(NlogN)

    最大子序列和问题--时间复杂度O(NlogN) package a; /* * 最大子序列和问题,时间复杂度O(NlogN) */ public class Sequence { private st ...

  10. HDU 1875(最小生成树)

    因为是全连接图,所以也可以用最小生成树 这道题给边加了一个限制条件,(10<=x<=1000),所以可能不能全连通,需要判断 #include <cstdio> #includ ...