第六章:函数

一、参数传递

1、形参为引用类型时,将绑定到相应的实参上,否则为实参的拷贝;在C++中建议用引用类型代替指针

2、const 形参:

  • 对于顶层的const,在函数形参中无效,也不能构成重载函数
  • 形参中尽量使用常量引用,对于普通引用会有误导,主要是非常量引用会导致函数不能接受常量的类型

3、数组形参:传递给函数的值为数组的首元素指针,所以一开始不知道数组的大小,有三种解决方法

  • 如果是C风格的字符串,则要保证字符串中最后一个字符为空字符
  • 传递数组的首元素好尾后元素的指针,使用begin和end函数
  • 传入数组指针和数组的大小

4、数组引用形参:如果形参是数组的引用,则维度是类型的一部分,不可少

    void print(int (&arr)[10])    //(&arr)[10]:括号不可少
    {
        ...
    }

5、传递多维数组:数组的第二维及后面的维度为数组类型的一部分,不能省略

    void print(int (*matrix)[10], int rowSize);    rowSize为数组第一维的长度

6、main函数的输入

  • argv用户输入的实参从argv[1]开始,argv[0]为保存程序的名字
  • argc为字符串的数量

二、返回类型和return语句

1、注意不要返回局部对象的引用或指针,局部变量会在函数返回后清空数据

2、如果函数返回的类型是可修改的左值,那么也可以直接作为左值来呗赋值

3、C++11可以返回{}内的列表:如vector,类等,如果只是sting,int这种{}内只能有一个值

4、返回数组指针:可以有很多的方式,但是最简单的是使用类型别名

  • C++11提供了尾置返回类型来代表函数的返回类型
    • auto func(int i) -> int(*)[10]
      int (*func(int i))[10]

三、函数重载:形参数量或形参类型上有所不同,不允许两个函数除了返回类型外其他所有要素都相同

1、const形参和重载

    Record lookup(Phone);
    Record lookup(const Phone);        //重复定义Record lookup(Phone);
    
    Record lookup(Phone *);
    Record lookup(Phone * const);    //重复定义Record lookup(Phone *);
    
    Record lookup(Account &);
    Record lookup(const Account &);    //底层const引用可以
    
    Record lookup(Account *);
    Record lookup(const Account *);    //底层const指针可以
  • 顶层const的形参和另一个没有顶层const的形参无法区分
  • 底层的const可以区分;如果传递了一个非const的对象时,编译器会优先选择非常量版本:编译器会选择与实参最佳匹配的函数

2、const_cast和重载:存在常量的版本,通过const_cast设计非常量的版本

3、重载与作用域:不同的作用域中无法重载函数名

4、调用重载函数时应尽量强制类型转换

四、特殊用途语言特性

1、默认实参:一旦某个形参被赋予了默认值,则它后面的所有形参都要有默认值(C中没有这个属性)

2、内联函数和constexpr函数:通常都定义在头文件中

  • 在函数返回类型前加上关键字inline可以被声明为内联函数
  • 内联函数可以避免函数调用的开销(C99后C支持,GUN C支持)
  • 内联机制用于优化规模小、流程直接、频繁使用的函数
  • constexpr函数:返回类型和形参的类型都是子明类型,而且函数体中必须有且只有一条return语句
  • constexpr函数被隐式地指定为内联函数
    • constexpr int new_sz(int i) {return i*3;}

3、调试帮助:

  • assert预处理宏:包含在cassert头文件中
    • assert(expr);    //对expr求值,为假则终止程序运行;为真assert什么都不做
      检查”不能发生的事“
  • NDEBUG预处理:#define NDEBUG : assert会无效
  • 特殊代码
    • __func__        :输出当前调试的函数名字:GCC两个都支持
      __FUNCTION__    :输出当前调试的函数名字(VC,VS中用这个)
      __FILE__        :存放文件名的字符串字面值
      __LINE__    :存放当前行号的整形字面值
      __TIME__    :存放文件编译时间的字符串字面值
      __DATE__    :存放文件编译日期的字符串字面值

五、函数指针:函数的类型由它的返回类型和形参类型共同决定,与函数名无关

1、使用函数指针:把函数名作为一个值使用时,该函数会自动转换成指针

    bool lengthCompare(const string &, const string &);
    函数类型:bool(const string &, const string &)
    pf = lengthCompare;
    pf = &lengthCompare;    //取地址符可选
  • 编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配,包括返回类型和参数类型

2、函数指针形参:编译器自动把函数类型转换为指针

void useBigger(const string &s1, const string &s2, bool pf(const string &, const string &));
void useBigger(cosnt string &s1, const string &s2, bool(*pf)(const string &, const string &));    //两个等价

3、返回指向函数的指针:这里编译器不会自动将函数返回类型当成对应的指针类型,所以必须自己处理好

  • 还是使用类型别名比较方便
  • using F = int(int *, int);
    using PF = int (*)(int *, int);
    PF f1(int);
    F *f1(int);       //F为函数类型,需要自己加*来变为指针
  • decltype适用于某个函数时,返回的是函数类型而非指针类型
时间: 2024-11-07 23:33:53

第六章:函数的相关文章

(转载)虚幻引擎3--第六章 –函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分: SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Client R

第六章函数和宏定义

C程序设计实验报告 实验项目: 第六章函数和宏定义 姓名:李儿龙  实验地点:514教室 实验时间:5.16 一.实验目的与要求 1.模块化程序设计: 6.4.2.2. 利用复化梯形公式计算定积分 掌握C语言中定义函数的方法: 掌握通过“值传递”调用函数的方法. 6.4.2.3. 计算Ackerman函数 掌握递归函数的设计方法: 进一步练习阅读检查与调试修改C程序的方法. 6.4.3.1. 编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 写出该

《Python 学习手册4th》 第十六章 函数基础

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 摘要 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构.一. 为何使用函数 最大化的代码重用和最小化代码冗余 流程的分解 本章习题: 1. 编写函数有什么

第六章 函数和调试

在本章中,你将学习以下两方面的基本知识: 函数 使用Python调试包pdb 函数是程序重要的组成部分,你将在第七章中使用它们,并学习如何使用随机化来模拟DNA突变.Python调试包pdb可以将程序放缓,按步执行找到出错的地方. 1.函数 函数是组织好的代码块,并提供一种方法(函数名称)可以传递一些值进行计算,然后返回结果.程序可以通过调用函数名称来使用函数中的代码,将函数所需的值传递给函数中的代码,然后返回结果,这种方式使用或“调用”通常称为调用函数.Python有许多内建的函数,例如上述使

第六章 函数;第七章 类;

函数: 1. 函数一定存在返回值,没返回值时返回None;    2. 函数内赋新值不会改变外部任何变量的值,这一点类似java:但是对于可变参数列表另当别论: 3. == 判断相等性,值考虑空间里面值的情况:is 同一性(等级更高,必然具有相等性) 4. 位置参数-> 关键字参数-> 收集参数:收集其他位的参数(一个*,函数内部接收到的是tuple,本来是tuple那么前面加*,就成了这种可变参数):定义收集参数,使用位置参数— >同时收集参数:收集带默认的参数构成字典(两个**,函数

C++ Primer中文版(第五版)——第六章 函数

6.1函数基础 一个典型的函数定义包括以下几个部分:返回类型(return type).函数名字.由0个或多个形参组成的参数列表以及函数体.其中,形参以逗号隔开,形参的列表位于一对圆括号之内.函数执行的操作在语句块中说明,该语句块称为函数体. 我们通过调用运算符(call operator)来执行函数.调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者是指向函数的指针:圆括号之内是一个用逗号隔开的实参列表,我们用实参初始化函数的形参.调用表达式的类型就是函数的返回类型. 编写函

第十六章 函数基础

#1. #A:python的def语句实际上是一个可执行语句,当他运行的时候,它创建一个新的函数对象并将其赋值给一个变量名 #B:因为def语句是一个语句,所以一个def可以出现在任一语句可以出现的地方,比如说嵌套在其他的语句中 #C:函数除了调用以外,还允许任意的属性附加到记录信息,以供使用 def FunA(Value): if Value: def FunB() : return 10 else: def FunB() : return 20 return 10 + FunB() b0 =

Lua 第五章、第六章--函数

在Lua中,函数是一种对语句和表达式进行抽象的主要机制.函数既可以完成某项特定的任务,也可以只做一些计算并返回结果. Lua具有一项非常于总不同的特征,允许函数返回多个结果: s, e = string.find("Hello Lua users", "Lua") print(s, e)            -->7    9 以Lua编写的函数同样可以返回多个结果,只需在return关键字后列出所有返回值即可: function maximum (a) l

【C++ Primer】 第六章 函数基础

函数基础 练习 练习6.6 1 #include<iostream> 2 using namespace std; 3 4 double myADD(double num1, double num2) 5 { 6 double result = num1 + num2; 7 static unsigned iCnt = 0; 8 ++iCnt; 9 cout << "该函数累计执行了" << iCnt << "次" &

第六章 函数[DDT书本学习 小甲鱼]【1】

6.1Python的乐高积木 程序分解为小的组成部分.三种方法实现:函数.对象.模块6.1.1 创建和调用函数 以前接触到的BIF就是Python帮我们封装好的函数 def 德芙 关键字: 代码如下 def myFirstFunction(): print("大家好,我是新来的1") print("大家好,我是新来的2") print("大家好,我是新来的3") myFirstFunction() 重复三次,该如何做? for i in rang