《C++ Primer Plus》读书笔记之五—函数-C++的编程模块
函数-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++的编程模块的更多相关文章
- C++ primer plus读书笔记——第7章 函数——C++的编程模块
第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...
- C++ Primer Plus读书笔记
第五章 循环和关系表达式 1. 2.类别别名: (1) #define FLOAT_POINTER float * FLOAT_POINTER pa, pb; 预处理器置换将该声明转换成 flo ...
- 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行
搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...
- 《C#图解教程》读书笔记之五:委托和事件
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执 ...
- C语言深度解剖读书笔记(6.函数的核心)
对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++); 这样的问题大多跟编译器有关,不要去刻意追求 ...
- 《C++ Primer》读书笔记 第一章
读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...
- 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
函数是C++的编程模块.要使用函数,必须提供定义和原型,并调用该函数.函数定义是实现函数功能的代码:函数原型描述了函数的接口:传递给函数的值的书目和种类以及函数的返回类型.函数调用使得程序将参数传递给 ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- 《Java并发编程的艺术》读书笔记:一、并发编程的目的与挑战
发现自己有很多读书笔记了,但是一直都是自己闷头背,没有输出,突然想起还有博客圆这么个好平台给我留着位置,可不能荒废了. 此文读的书是<Jvava并发编程的艺术>,方腾飞等著,非常经典的一本 ...
随机推荐
- nginx安装及其配置详细教程
1 nginx 介绍 1 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 由俄罗斯的程序设计师Igor Sysoev所开发,官方 ...
- 最新 IntelliJ Idea 2017 激活方法(转)
转载地址:http://www.cnblogs.com/suiyueqiannian/p/6754091.html 1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入 ...
- 如何去组织你的CSS代码
1.Object Oriented CSS (OOCSS) 面向对象的 CSS.OOCSS 的想法首先要明白 CSS 的 “Object” 是个毛线玩意. CSS的样式是需要应用到页面的结构上的.通俗 ...
- (二)JNI方法总结
整个网上就没看到一个关于JNI好点的文档,干脆自己写一份,以方便以后使用的时候查阅 1. 类操作 DefineClass jclass DefineClass(JNIEnv *env, jobject ...
- [转]Charts (Report Builder and SSRS)
本文转自:https://docs.microsoft.com/en-us/sql/reporting-services/report-design/charts-report-builder-and ...
- Lambda表达式&匿名方法
“Lambda表达式“(lambda Expression)就是一个匿名函数(匿名方法),lambda表达式基于数学中的入演算得名. lambda运算符:所有的lambda表达式都是用新的lambda ...
- ASP.NET之HTML
1.什么是html 用来描述网页的2.开发工具我们肯定是用vs啦3.img src 图片地址 <img src="img/aa.bmp" />; 4.超链接a标签 hr ...
- 撩课-Java每天10道面试题第3天
21.final, finally, finalize的区别 1.final修饰符(关键字). 被final修饰的类, 就意味着不能再派生出新的子类, 不能作为父类而被子类继承. 因此一个类不能既被a ...
- input输入框限制(座机,手机号码)
记录一下 座机input输入框: <input style="width:100px;" id="tel" type="text" o ...
- Android Studio下载/更新SDK
今天安装配置Android Studio的时候,用SDK Manager下载SDK的时候只显示了一个7.0,别的都刷新不出来(被墙了).去网上搜索怎么解决,发现很多帖子的方法已经过时了(跟现在的AS版 ...