C++ primer 函数

函数的定义
由函数名和一组操作数类型唯一地表示。函数的操作数就是形参,在圆括号内声明,如果形参较多就是形参表,逗号隔开。每一个函数都有一个相关联的返回类型。

函数的调用
调用操作符,一对圆括号,实现函数的调用。调用操作符的操作数就是函数名和一组实参。
函数调用主要做了两件事:用对应的实参初始化函数的形参,并将控制权转移给被调用函数。
函数体是一个作用域,在函数体内定义的变量是局部变量,只有在该函数中才可以访问。
当执行到return语句时,函数调用结束,被调用的函数完成时,将产生一个在return语句中指定的结果值。

形参和实参
形参类似于局部变量,函数的形参为函数提供已命名的局部存储空间。他们之间的区别是形参是在函数的形参表中定义的,并有调用函数的时候传递函数的实参初始化。
实参是一个表达式,和形参的类型相同

函数的返回类型
可以是内置类型,类类型,复合类型 ,void。
函数必须制定返回类型

形参表
形参表可以为空但不可以忽略
形参表由一系列逗号分隔的参数类型和参宿名组成,如果连个参数的类型相同,参数类型必须重复声明。

函数的定义和声明都不需要extern关键字

参数传递
形参的初始化和变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参是引用类型,则只是实参的别名。
1.非引用的形参
通过复制实参初始化,函数并没有调用所传递的实参本身,因此不会修改实参的值。
2.指针形参
如果函数形参是非const类型的指针,函数可以通过指针实现赋值,修改指针所指的对象
如果要保护指针所指的对象,需将形参定义为const 指针
3.const 形参
使用非引用的非const形参,既可以传递给函数const实参也可以传递非const实参,反之亦然,因为形参只是实参的复制。

复制实参具有局限性:
• 当需要在函数中修改实参的值时。
• 当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过在。
• 当没有办法实现对象的复制时。

引用形参
和所有的引用一样,引用形参直接关联到所绑定的对象,而不是这些对象的副本
每次调用函数,引用形参被创建并与相应实参绑定

从 C 语言背景转到 C++ 的程序员习惯通过传递指针来实现对实参的访问。在 C++ 中,使用引用形参则更安全和更自然。

使用引用形参返回额外的信息
函数只可以返回单个值,使用引用形参返回多个值

利用const引用避免复制
使用引用形参,函数可以直接访问实参对象,而不需要复制
使用const形参还可以确保函数不可以通过引用来修改实参

如果函数具有普通的非const引用形参,那显然不可以通过const对象进行调用,非const引用形参只可以和完全同类型的非const对象关联。

应该将不需要修改的引用形参定义为 const 引用。普通的非 const 引用形参在使用时不太灵活。这样的形参既不能用 const 对象初始化,也不能用字面值或产生右值的表达式实参初始化。

vector和其他容器类型的形参
调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素
c++程序员倾向于通过传递指向容器中需要处理的元素的迭代器传递容器

数组形参
数组有两个性质:一是不能复制数组,二是使用数组名字时,数组名会自动转化成第一个元素的指针
因为不能复制,所以不能使用数组类型的形参。因为二,通常操纵指向数组元素的指针处理数组
虽然不能直接传递数组,但是函数的形参可以写成数组的形式,等价于指向数组元素的指针,将数组形参直接定义为指针比使用数组语法定义要好。
如下三种定义:
void printv( int * )
void printv( int[] )
void printv( int[10])
三种定义等价
当编译器检查数组形参关联的实参时,它只会检查实参是不是指针,指针的类型和数组元素类型是否匹配,而不会检查数组的长度

通过引用传递数组
如果形参是数组的引用,编译器不会讲数组实参转化为指针,而是传递数组的引用本身,这时,数组大小成为实参和形参类型的一部分,编译器检查实参的大小和形参的大小是否匹配

使用标准库规范
传递指向指针的第一个和最后一个元素的下一个位置的指针

return语句
用于结束当前的正在执行的函数
不带返回值的函数只用于void类型函数

递归
间接或直接调用自己的函数
递归函数必须定义一个终止条件

函数声明
函数声明由返回类型,函数名和形参表组成。这三个元素称为函数原型。函数原型描述了函数的接口
函数声明中形参名会被忽略
函数应该在头文件中声明在源文件中定义,定义函数的源文件要包含声明该函数的头文件,这样可以使编译器检查该函数的定义和声明是否一致

默认实参
默认实参是通过给形参表提供明确的初值来指定的
如果一个形参 具有默认实参,那其后的所有形参都必须具有默认实参
调用具有默认实参的函数,可以为该形参提供实参,也可以不提供。如果提供了就会覆盖默认实参。
通常应该在函数声明中指定默认实参,并将该声明放在合适的头文件中
如果在函数定义的形参表中提供默认的实参,只有在包含该函数定义的源文件中调用该函数,默认实参才是有用的

自动对象
只有当定义它的函数被调用的时候才存在的对象称为自动对象
形参也是自动对象
都在定义他们的语句块结束后撤销

静态局部对象
一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,将这样的对象定义为 static(静态的)
这种对象一旦被创建,在程序结束前都不会撤销。当定义静态局部对象的函数结束时,静态局部对象不会撤销。

内联函数
内联机制适用于优化小的、只有几行的而且经常被调用的函数。
内联函数应该在头文件中定义,这一点不同于其他函数。在头文件中加入或修改 inline 函数时,使用了该头文件的所有源文件都必须重新编译。

类的成员函数
和普通函数一样,包含四个部分:
• 函数返回类型。
• 函数名。
• 用逗号隔开的形参表(也可能是空的)。
• 包含在一对花括号里面的函数体。
前三部分是函数原型,函数原型必须在类中定义。但是,函数体则既可以在类中也可以在类外定义。

定义成员函数的函数体
类的所有成员都必须在类定义的花括号里声明,编译器隐式的将类内定义的成员函数当做内联函数
类的成员函数可以访问类的private成员

this指针
每一个成员函数都有一个隐含的,额外的形参this。再调用成员函数时,形参this初始化为调用函数的对象的地址

const成员函数的引入
const改变了隐含this指针的类型,隐含的this指针将是一个指向对象的const指针。
用这种方式使用const函数称为常量成员函数
const 对象、指向 const 对象的指针或引用只能用于调用其const 成员函数,如果尝试用它们来调用非 const 成员函数,则是错误的。

this指针的使用
不必显式地使用 this 指针来访问被调用函数所属对象的成员。对这个类的成员的任何没有前缀的引用,都被假定为通过指针 this 实现的引用

在类外定义成员函数
必须指明他们是类的成员
使用作用与操作符指明函数是类的作用域范围内定义的

构造函数
构造函数是特殊的成员函数,构造函数和类同名,而且没有返回类型,每个构造函数必须有与其他构造函数不同数目或类型的形参
和其他成员函数一样,构造函数也必须在类内声明,可以在类内或者类外定义
构造函数放在public部分
这里写图片描述
在冒号和花括号之间的代码称为构造函数的初始化列表。构造函数的初始化列表为类的一个或多个数据成员指定初值。它跟在构造函数的形参表之后,以冒号开关。构造函数的初始化式是一系列成员名,每个成员后面是括在圆括号中的初始值。多个成员的初始化用逗号分隔。

类代码文件的组织
通常将类的声明放在头文件中,类外定义的成员函数放在源文件中,类定义应置于名为 type.h 或 type.H 的文件中,type 指在该文件中定义的类的名字。成员函数的定义则一般存储在与类同名的源文件中。

重载函数
出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数。
在函数中局部声明的名字将屏蔽在全局作用域内声明的同名名字。
如果局部地声明一个函数,则该函数将屏蔽而不是重载在外层作用域中声明的同名函数。由此推论,每一个版本的重载函数都应在同一个作用域中声明。
一般来说,局部地声明函数是一种不明智的选择。函数的声明应放在头文件中。

c++中名字查找在类型检查之前

函数匹配和实参转换
函数重载确定, 即函数匹配是将函数调用与重载函数集合中的一个函数相关联的过程。
匹配结果有三种可能:
1. 编译器找到与实参最佳匹配的函数,并生成调用该函数的代码。
2. 找不到形参与函数调用的实参匹配的函数,在这种情况下,编译器将给出编译错误信息。
3. 存在多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是,该调用具有二义性。

重载确定的三个步骤
1.候选函数
2.选择可行函数
3.寻找最佳匹配(如果需要的话)

实参类型的转换
1.精确匹配
2.类型提升
3.标准转换
4.类类型转换

仅当形参是引用或者指针的时候,形参是否为const才有影响

指向函数的指针
这里写图片描述
圆括号是必须的
用typedef简化函数指针的定义
这里写图片描述
这里写图片描述
可使用函数名对函数指针进行初始化和赋值
直接使用函数名等效于在函数名上应用取地址操作符
指向函数的指针不需要使用解引用操作符,可以直接通过指针调用函数,如果指针没有初始化或者0值,不可以使用 。

函数指针形参。。
返回指向函数的指针。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值