函数-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. SQL脚本添加删除修改字段

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  2. HDOJ 5019 Revenge of GCD

    Revenge of GCD In mathematics, the greatest common divisor (gcd), also known as the greatest common ...

  3. IOS项目之弹出动画二

    在IOS项目之弹出动画一中只是实现也功能,并没有体现面向对象的思想 ,今天就试着把它封装了一下,弹出视图的内容可以根据自定义,此处只是用UIDatePicker来演示 我把它传到了GitHub上    ...

  4. SQL Serever学习16——索引,触发器,数据库维护

    sqlserver2014数据库应用技术 <清华大学出版社> 索引 这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样 数据库索引可以帮助我们快速定位数 ...

  5. Connection连接、关闭数据库

    创建连接sql server数据库的字符一般有两种, 一种是以sql验证登录的 一种是以windows身份验证的 步骤: 引用命名空间System.Date.SqlClient 将连接方法声明至字符串 ...

  6. Xss和Csrf介绍

    Xss和Csrf介绍 Xss Xss(跨站脚本攻击),全称Cross Site Scripting,恶意攻击者向web页面中植入恶意js代码,当用户浏览到该页时,植入的代码被执行,达到恶意攻击用户的目 ...

  7. 如鹏网学习笔记(五)MySql基础

    MySQL基础 一.数据库概念 1,网友装备信息.论坛帖子信息.QQ好友关系信息.学籍管理系统中的学生信息等都要“持久化”的保存到一个地方, 如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享 ...

  8. mysql数据库重点(基础优化)

    ### Mysql性能优化 尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替* 尽量减少字段列的数学计算,如:where num * 2 >= 30,可 ...

  9. mybatis oracle 顺序模糊匹配

    前言:有时需要顺序模糊匹配字段. 用一半的 % 就好: t.item like #{item}||'%'

  10. K:求取两个数的最大公约数的两个算法

    相关介绍:  最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为gcd(a,b).同样的,a,b,c的最大公约数记为gcd(a,b,c),多个整数的最 ...