第8章   函数探索
8.1C++内联函数
(1)常规函数的执行过程:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数的参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还将返回值          放入到寄存器中),然后跳回到地址被保存的指令处。
(2)内联函数:[1]代码执行时间短,函数经常被调用[2]定义:编译器将使用相应的函数代码替换函数调用,程序无需再跳到另一个位置处执行,在跳           回来              [3]如何选择:如果执行函数代码的时间比处理函数调用机制的时间长,则节省时间将只占整个过程的很小一部----                    ------  分[4]内联函数不能递归[5]请求将函数作为内联函数时,编译器并不一定会满足这种要求[6]内联与宏#include<iostream>#define SQUARE(x) ((x)*(x))inline double square(double x) {return x*x;}using namespace std;int main(){int c=2;//cout<<c++*c++<<endl;cout<<SQUARE(c++)<<endl;    //c++*c++cout<<c<<endl;              //c递增两次,宏不能按值传递int d=2;cout<<square(d++)<<endl;//d递增一次cout<<d<<endl;return 0;}
8.2引用变量
8.2.1
(1)典型用途:作为函数参数,结构和对象的参数
(2)必须声明引用变量是初始化
(3)引用更接近const指针,必须在创建时初始化int &rodents = rats;int * const pr = &rats;#include<iostream>using namespace std;int main(){int rats = 101;int &rodents = rats;cout<<"rat = "<<rats;cout<<",rodents = "<<rodents<<endl;cout<<"rats address = "<<&rats;cout<<",rodents address = "<<&rodents<<endl;int bunnies=50;rodents = bunnies;  //可以通过初始化声明来设置引用,但不能通过赋值来设置cout<<"bunnies = "<<bunnies;cout<<",rats = "<<rats;cout<<",rodents = "<<rodents<<endl;cout<<"bunnies address = "<<&bunnies;cout<<",rats address = "<<&rats;cout<<",rodents address = "<<&rodents<<endl;return 0;}int rats = 101;int * pt = &rats;int &rodents = &pt;int bunnies = 50;pt = &bunnies;rodents 引用的还是rats
8.2.2
(1)按值传递和按引用传递
(2)函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的
8.2.3
实参的类型与引用参数类型不匹配,但可被转换为引用类型,程序将创建一个正确类型的临时变量
(1)什么时候创建临时变量?(如果引用参数是const)[1]实参的类型正确,但不是左值[2]实参的类型不正确,但可以转换为正确的类型什么是左值?P271可以被引用的数据对象,如:变量,数组元素,结构成员,引用,???解除引用的指针???非左值,如:字面变量(5.0)(用引号括起的字符串除外)
(2)将引用参数声明为常量数据的引用的理由:[1]使用const可以避免无意中修改数据的编程错误;[2]使用const使函数能够处理const和非const实参,否则将只能接收非const数据;[3]使用const引用使函数能够正确生成并使用临时变量。
8.2.4
(1)返回值为引用:返回引用的函数实际上是被引用变量的别名
(2)注意问题:避免返回函数终止时不再存在的内存单元引用(返回一个指向临时变量的引用)   解决方法:[1]返回一个作为参数传递给函数的引用[2]???用new来分配新的存储空间const free_throws & clone(free_throws &ft){free_throws *pt;*pt = ft;return *pt;}free_throws &jolly = clone(three);
(3)const用于引用返回类型返回const引用是不可修改的左值,8.2.7何时使用引用参数
8.3
默认参数:当函数调用中省略了实参时自动调用的一个值#include<iostream>#include<cstring>using namespace std;char *left(char *str,int n=1){if(n<0)//用户要求字符数目为负{n=0;}//用户要求字符数目可能多于字符串包含的字符数int len=strlen(str);n=n<len?n:len;char *p=new char [n+1];int i;for(i=0;i<n;i++){p[i]=str[i];}p[i]='\0';return p;}int main(){char str[1024];int n;while(cin>>str/*>>n*/){cout<<left(str/*,n*/132323)<<endl;}return 0;}8.4
(1)函数重载:名称相同,参数数目和/或参数类型不同和/或返回类型不同类型引用和类型本身视为同一个特征标
(2)一个数字左边几位unsigned long left(unsigned long num,unsigned ct){unsigned digits = 1;unsigned logn n = num;if(ct == 0||num == 0){return 0;}while(n/=10){digits++;}if(digits>ct){ct = digits - ct;while(ct--){num/=10;}return num;}else{return num;}}
(3)何时使用?P289函数基本上执行相同的任务,但使用不同形式的数据时使用一个但默认参数的函数简单些
8.5函数模板
(1)       template<typename T>void Swap(T &a,T&b){T temp;temp = a;a = b;b = temp;    }template<typename T>void Swap(T a[],T b[],int n){T temp;for(int i=0;i<n;i++){temp = a[i];a[i] = b[i];b[i] = temp;}}
(2)显示具体化  template <typename T>         void Swap(T &,T &)           --模板函数void Swap(job &,job &)       --非模板函数当编译器找与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板struct job{char name[40];double salary;int floor;};template<>void Swap<job>(job &j1,job &j2)    --具体化原型{double t1;int t2;t1= j1.salary;j1.salary=j2.salary;j2.salary=t1;t2=j1.floor;f1.floor=j2.floor;j2.flooe=t2;}template<typename T>void Swap(T &a,T &b){T temp;temp=a;a=b;b=temp;}
8.5.4
(1)编译器使用模板为特定类型生成函数定义时,得到函数模板的实例
(2)模板并非函数的定义,但是使用int的模板实例是函数定义
(3)隐式实例化:由于调用Swap()函数时提供了int
(4)显示实例化:直接命令编译器创建特定的实例template void Swap<int>(int,int);(5)显示具体化template<>void Swap<int>(int&,int&);template<>void Swap(int &,int &)
(6)试图在同一个文件(或转换单元)中使用同一种类型的显示实例化和显示具体化将出错
(7)显示实例化:template显示具体化:template<>
8.5.5
(1)指向非const数据的指针和引用优先于非const指针和引用参数列表const和非const之间的区别只适用于指针和引用指向的数据二义性错误:struct blot {int a; char b[10]};blot ink={25,"sports"};recycle(ink);void recysle(blot);void recycle(const blot);
(2)一个完全匹配优先于另一个的另一种情况,非模板函数优先于模板函数(显示具体化)
(3)如果两个完全匹配的函数都是模板函数,则较具体的模板函数优先struct blot {int a; char b[10]};blot ink={25,"sports"};recycle(&ink);           选#2template<class Type> void recycle(Type t)       #1template<class Type> void recycle(Type *t)      #2两个隐式实例recycle<blot*>(blot*)    #1recycle<blot>(bloe *)    #2

第8章 函数探索相关推荐

  1. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  2. 第1章-数据探索(1)-数据预处理

    简介 在我们了解了业务背景,确定了需求和分析目标以后,我们接下来要面对的,就是数据的探索了.不论数据的形式是直接连到数据库.还是导出的csv.txt.json等格式,当我们把数据加载到我们的分析利器( ...

  3. c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt

    C语言课程第6章 函数及编译预处理 6.1模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题. ...

  4. Python 精要参考(第二版) 第六章 函数与函数编程

    1. 第六章 函数与函数编程 为便于代码维护,绝大多数子程序都被分解并重新组织为函数以使代码模块化. 在 Python中定义一个函数很简单,Python从其它函数编程语言中借鉴了很多有用的思路用来简化 ...

  5. Swift 1.1语言第7章 函数和闭包

    Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...

  6. 【数理知识】《数值分析》李庆扬老师-第3章-函数逼近与快速傅里叶变换

    第2章 回到目录 第4章 第3章-函数逼近与快速傅里叶变换 3.1 函数逼近的基本概念 3.2 正交多项式 3.3 最佳平方逼近 3.4 曲线拟合的最小二乘法 3.5 有利逼近 3.6 三角多项式逼近 ...

  7. 《BOOST程序库完全开发指南》 第11章 函数与回调

    第11章  函数回调 #include <iostream> #include <boost/assign.hpp> #include <boost/ref.hpp> ...

  8. python编程设计大学ppt_Python程序设计-清华大学出版社-董付国第5章-函数的设计和使用PPT...

    PPT内容 这是Python程序设计-清华大学出版社-董付国第5章-函数的设计和使用PPT下载,主要介绍了函数定义:斐波那契数列:形参与实参:参数类型:默认值参数:关键参数:可变长度参数:参数传递的序 ...

  9. c语言程序设计函数6,C语言程序设计》第6章函数-XiamenUniversity.PDF

    厦门大学非计算机专业本科生公共课 (2012-2013第2学期) <C语言程序设计> 第6章 函数 林子雨 厦门大学计算机科学系 E-mail: ziyulin@ 个人主页:/linziy ...

最新文章

  1. 恢复Linux误删除文件系列之scalpel工具
  2. Linux下使用终端调试Python程序:pudb
  3. 为什么技术进步让我们越来越焦虑不安?
  4. html中的ppt文字不清晰,HTML页面的文字布局与文字效果.ppt
  5. 员工邮箱能收不能发的解决方法
  6. 互联网公司面试必问的mysql题目
  7. linux虚拟机头文件快捷键,linux学习笔记——基础命令、快捷键与认识虚拟机
  8. 【190111】VC+Access工程信息管理系统源代码
  9. 神州炫龙蓝天刷bios教程(百分百成功/不成功下面留言)
  10. 初二计算机会考图操作,初二年级信息技术会考-考试大纲
  11. 会议管理系统java_javaweb会议管理系统
  12. LeetCode题解(LCP03):机器人大冒险(Python)
  13. 快收藏ReactOS 新手指南
  14. Feign - Error while extracting response for type [class java.lang.String]
  15. python爬虫和医学数据_【爬虫】(八)Python之爬虫和数据小解析
  16. Python爬虫框架Scrapy入门(三)爬虫实战:爬取长沙链家二手房
  17. 如何设置云服务器语言,云服务器如何更换语言
  18. PCI GXL系统测试报告1(支持混合传感器)
  19. Redis三主三从集群搭建
  20. XSS挑战之旅[全20关]上

热门文章

  1. 云服务器 ECS 搭建WordPress网站:购买 Linux 实例
  2. 聊天窗口,新加的内容直接 往上顶
  3. python学习(1)启程
  4. 解决由于Windows Installer造成的SAV安装失败的问题
  5. C++ 模板实例化与调用
  6. WebService的相关概念
  7. Oracle 安装 RAC 11.2.0.4 centos7.4 -udev磁盘绑定/执行root脚本报错
  8. 裘宗燕:C/C++ 语言中的表达式求值
  9. TZOJ 4813 机器翻译(模拟数组头和尾)
  10. 杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》...