首页 > 其他分享 >笔记 -- 第六章

笔记 -- 第六章

时间:2024-11-28 21:32:37浏览次数:9  
标签:返回 const 函数 形参 -- 笔记 类型 第六章 实参

第六章 函数

函数基础

  • 函数定义:包括返回类型、函数名字和0个或者多个形参(parameter)组成的列表和函数体。
  • 调用运算符:调用运算符的形式是一对圆括号 (),作用于一个表达式,该表达式是函数或者指向函数的指针。
  • 圆括号内是用逗号隔开的实参(argument)列表。
  • 函数调用过程:
    • 1.主调函数(calling function)的执行被中断。
    • 2.被调函数(called function)开始执行。
  • 形参和实参:形参和实参的个数和类型必须匹配上。
  • 返回类型: void表示函数不返回任何值。函数的返回类型不能是数组类型或者函数类型,但可以是指向数组或者函数的指针。
  • 名字:名字的作用于是程序文本的一部分,名字在其中可见。

局部对象

  • 生命周期:对象的生命周期是程序执行过程中该对象存在的一段时间。
  • 局部变量(local variable):形参和函数体内部定义的变量统称为局部变量。它对函数而言是局部的,对函数外部而言是隐藏的。
  • 自动对象:只存在于块执行期间的对象。当块的执行结束后,它的值就变成未定义的了。
  • 局部静态对象:static类型的局部变量,生命周期贯穿函数调用前后。

函数声明

  • 函数声明:函数的声明和定义唯一的区别是声明无需函数体,用一个分号替代。函数声明主要用于描述函数的接口,也称函数原型。
  • 在头文件中进行函数声明:建议变量在头文件中声明;在源文件中定义。
  • 分离编译: CC a.cc b.cc直接编译生成可执行文件;CC -c a.cc b.cc编译生成对象代码a.o b.o; CC a.o b.o编译生成可执行文件。

参数传递

  • 形参初始化的机理和变量初始化一样。
  • 引用传递(passed by reference):又称传引用调用(called by reference),指形参是引用类型,引用形参是它对应的实参的别名。
  • 值传递(passed by value):又称传值调用(called by value),指实参的值是通过拷贝传递给形参。

传值参数

  • 当初始化一个非引用类型的变量时,初始值被拷贝给变量。
  • 函数对形参做的所有操作都不会影响实参。
  • 指针形参:常用在C中,C++建议使用引用类型的形参代替指针。

传引用参数

  • 通过使用引用形参,允许函数改变一个或多个实参的值。
  • 引用形参直接关联到绑定的对象,而非对象的副本。
  • 使用引用形参可以用于返回额外的信息。
  • 经常用引用形参来避免不必要的复制。
  • void swap(int &v1, int &v2)
  • 如果无需改变引用形参的值,最好将其声明为常量引用。

const形参和实参

  • 形参的顶层const被忽略。void func(const int i);调用时既可以传入const int也可以传入int
  • 我们可以使用非常量初始化一个底层const对象,但是反过来不行。
  • 在函数中,不能改变实参的局部副本。
  • 尽量使用常量引用。

数组形参

  • 当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
  • 要注意数组的实际长度,不能越界。

main处理命令行选项

可变形参

initializer_list提供的操作(C++11):

操作 解释
initializer_list lst; 默认初始化;T类型元素的空列表
initializer_list 列表中的元素是const。
lst{a,b,c...}; 拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素。
lst2(lst) 拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素。
lst2 = lst 同上
lst.size() 列表中的元素数量
lst.begin() 返回指向lst中首元素的指针
lst.end() 返回指向lst中微元素下一位置的指针
initializer_list使用demo:
void err_msg(ErrCode e, initializer_list<string> il){
  cout << e.msg << endl;
  for(auto bed=il.begin(); beg!=il.end(); ++beg)
    cout << *beg << " ";
  cout << endl;
}
err_msg(ErrCode(0), {"functionX", "okay"});
  • 所有实参类型相同,可以使用initializer_list的标准库类型。
  • 实参类型不同,可以使用可变参数模板
  • 省略形参符: ...,便于C++访问某些C代码,这些C代码使用了varargs的C标准功能。

返回类型和return语句

无返回值函数

没有返回值的return语句只能用在返回类型是void的函数中,返回void的函数不要求非得有return语句。

有返回值函数

  • return语句的返回值的类型必须和函数的返回类型相同,或者能够隐式地转换成函数的返回类型。
  • 值的返回:返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。
  • 不要返回局部对象的引用或指针。
  • 引用返回左值:函数的返回类型决定函数调用是否是左值。调用一个返回引用的函数得到左值;其他返回类型得到右值。
  • 列表初始化返回值:函数可以返回花括号包围的值的列表。(C++11)
  • 主函数main的返回值:如果结尾没有return,编译器将隐式地插入一条返回0的return语句。返回0代表执行成功。

返回数组指针

  • Type (*function (parameter_list))[dimension]
  • 使用类型别名:typedef int arrT[10]; 或者 using arrT = int[10;],然后 arrT* func() {...}
  • 使用decltypedecltype(odd) *arrPtr(int i) {...}
  • 尾置返回类型:在形参列表后面以一个->开始:auto func(int i) -> int(*)[10](C++11)

函数重载

  • 重载:如果同一作用域内几个函数名字相同但形参列表不同,我们称之为重载(overload)函数。
  • main函数不能重载。
  • 重载和const形参:
    • 一个有顶层const的形参和没有它的函数无法区分。Record lookup(Phone* const)和 Record lookup(Phone*)无法区分。
    • 相反,是否有某个底层const形参可以区分。Record lookup(Account*)和 Record lookup(const Account*)可以区分。
  • 重载和作用域:若在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体,在不同的作用域中无法重载函数名。

特殊用途语言特性

默认实参

  • string screen(sz ht = 24, sz wid = 80, char backgrnd = ' ')
  • 一旦某个形参被赋予了默认值,那么它之后的形参都必须要有默认值。

内联(inline)函数

  • 普通函数的缺点:调用函数比求解等价表达式要慢得多。
  • inline函数可以避免函数调用的开销,可以让编译器在编译时内联地展开该函数。
  • inline函数应该在头文件中定义。

constexpr函数

  • 指能用于常量表达式的函数。
  • constexpr int new_sz() {return 42;}
  • 函数的返回类型及所有形参类型都要是字面值类型。
  • constexpr函数应该在头文件中定义。

调试帮助

  • assert预处理宏(preprocessor macro):assert(expr)
    开关调试状态:
    CC -D NDEBUG main.c 可以定义这个变量NDEBUG
void print(){
  #ifdef NDEBUG
    cerr << _func__ << "..." << endl;
  #endif
}

函数匹配

  • 函数指针:是指向函数的指针。
  • bool (*pf)(const string &, const string &); 注:两端的括号不可少。
  • 函数指针形参:
    • 形参中使用函数定义或者函数指针定义效果一样。
    • 使用类型别名或者decltype
    • 返回指向函数的指针:1.类型别名;2.尾置返回类型。

函数指针

标签:返回,const,函数,形参,--,笔记,类型,第六章,实参
From: https://www.cnblogs.com/sys-123456/p/18573204

相关文章

  • Java中的“多态“详解
    多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许同一个接口或方法在不同对象上具有不同的实现方式。多态性使得程序在运行时可以根据对象的实际类型来决定调用哪个方法,从而提高代码的灵活性和可扩展性。在Java中,多态主要通过以下几种方式实现:1.方法重载(编译时多态......
  • css魔方应用案例
    css3D如何实现一个魔方呢首先我们需要用六个盒子拼成一个正方形。1.先写出HTML基本样式我们这里先用一个大盒子包裹着六个小盒子写出基本样式:现在网页呈现的效果是这样的,我们现在来设置一下基本的css样式,第一步:我们首先给他们的外部大盒子设置一下宽高和背景颜色第......
  • 毕业设计-springboot电商平台源码+10000字论文
    项目简介电商平台是一个综合性的在线交易系统,旨在简化传统商品交易信息管理的复杂性,提高管理效率和数据安全性。该系统通过集成多项功能,包括商家管理、商品订单管理、用户管理、商品管理和商品评价管理等,为不同用户提供了便捷的操作界面和强大的后台管理能力。系统采用Mysql数......
  • 毕业设计-springboot社区养老服务平台源码+10000字论文
    项目简介社区养老服务平台是一个旨在提高信息管理效率和服务质量的系统,它通过集中管理信息,确保了信息的保密性、高效性、大容量存储和低成本。该平台在Eclipse环境中使用Java语言编码,并采用Mysql数据库保存数据,为用户提供了一个信息显示和服务的集成平台。系统的主要功能包括:......
  • 「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
    本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择,或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。关键词UI互动应用颜色选择器状态管理用户输入界面动态更新一、功能说明颜色选择器应......
  • [做题记录]ABC F/G/Ex 做题计划
    \(\mathbf{Luogu\Atcoder}\)页面题目难度设置紫,从上向下排刷。ABC133F离线后树上差分。设四元组\(\langleu,c,v,w\rangle\)表示从\(u\)点开始到根,颜色是\(c\)的权值全部替换成\(v\),答案需要加/减。设\(f_u\)表示从\(u\)到根颜色与\(u\)相同的点的个数,\(......
  • [笔记]min25 筛
    解决积性函数\(f\)的前缀和问题。下文中的一些记号:\(F(n)=\sum_{i=1}^{n}f(i)\):\(f(i)\)的前缀和。\(\text{lp}(n)\):\(n\)的最小质因子。\(p_k\):全体质数中第\(k\)小的质数。\(\dfrac{x}{y}\):默认下取整。首先尝试解决这个问题:求出\[G(m)=\sum_{i......
  • 云斗 E. 开上我心爱的新能源车
    芙芙的超级矩阵蛋糕-云斗补题域-题目详情-云斗学院(yundouxueyuan.com)给出一种思路。我觉得T2贪心就可以吧,完了T1反悔贪就可以。T2:首先对于一行来说,在忽略0的情况下,如果他是单调不降的,那么这一行就一定可以变成单调不降的(因为单调不降,0可以直接等于其两边的值)。同理如果......
  • [笔记]各种模板
    启动。快排(带随机)voidqsort(intl,intr){ if(l>=r)return; vector<int>p,q;p.clear(),q.clear(); for(inti=l;i<=r;i++){ if(a[i]<a[l])p.push_back(a[i]); if(a[i]>a[l])q.push_back(a[i]); } intu=l,v=r,val......
  • 2024.11.28周四
    2024.11.28周四Q1.1200给定a,b。构造一数组,满足平均值为a,中位数为b。Q2.1300给定4个数字,输出1~5中未出现的数字。Q3.1500给定一数组,每次操作你可以选择一个元素ai在数组右边添加i-1个0。问任意操作数组长度的最大值。A1.9mins考虑等差数列,3个元素便能构造出来......