《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并发编程的艺术>,方腾飞等著,非常经典的一本 ...
随机推荐
- Android Anwendungsprogramm Entwicklung
1.Einführung des Androids 1.1 Grundlage der Anwendung Activity ist eine Spezifische Bespiel von Andr ...
- 网页布局之Div
div(division分区) 它是一个块标签,主要用来把网页中相关的内容组织到一起 你可以把网页的头部放到一个标签中,主体部分放到另一个标签中 使用class类名描述div内容 要想区分每个div, ...
- Java实现进程调度算法(一) FCFS(先来先服务)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...
- SpringBoot管理Banner
一.引言 在springboot项目启动的时候,会在console控制台中打印出一个SPRING的图案.有时候为了减少日志输出以及控制台的输出,就需要将这些给去除:有时候需要换上个人的标签等标识,就需 ...
- csu 1356 Catch bfs(vector)
1356: Catch Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 96 Solved: 40[Submit][Status][Web Board] ...
- Runtime 打开记事本
package com.direct.str; import java.io.IOException; public class RunTimeDemo { /** * @param args */ ...
- Berlekamp-Massey算法
\(BM\) 算法 用处 它可以用来求常系数线性递推的系数,并且可以求出最短的 求出来有什么用呢? 你可以闷声Cayley-Hamilton定理优化递推矩阵快速幂 算法简介 首先设一个数列 \(f\) ...
- BZOJ2568 [国家集训队2012]比特集合
Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...
- border-radius圆角兼容方案
1.下载ie-css3.htc 2.CSS代码段 box { -moz-border-radius: 15px; /* Firefox */ -webkit-border-radius: 15px; ...
- wampserver 更改www目录
现在大家基本上开发php的有很大一部分都在用Wampserver,今天来讲讲怎么更改默认的www目录, 需要修改的文件有三个 apache2的配置文件 httpd.conf 和 Wampserver的 ...