C++学习笔记6——函数(重点)

来源:互联网 发布:宁德电脑数据恢复专家 编辑:程序博客网 时间:2024/04/30 04:41

int abc(int a,int b){ ///return;}这是一个名为abc的函数,圆括号中的a,b是函数的操作数,也叫做形参。“{ }”中的部分是函数执行的运算,叫做函数体,函数名前的类型是函数的返回类型。

abc(2,3)可以调用这个函数,包括函数名+()中的实参(实际存在的参数)。其结果就是定义函数是的返回类型。

在函数体内定义的变量只在函数内才可以访问,这种变量称为局部变量。函数的返回类型可以是内置类型,类类型或复合类型,void类型,指向函数的指针,指向数组的指针;但是函数不能返回另一个函数或者是数组类型。

在每次调用函数的时候,会创建该函数所有的形参,然后用传递的实参来初始化这些形参。

一般情况下,使用的非引用形参只是利用实参的副本来初始化,函数调用并不访问所传递的实参本身,因此不会改变实参的值。

函数的参数可以是指针,指针为形参,在调用过程中,其值不会变(指针的值也就是其所指向的地址),但是若对调用函数中复制的指针进行赋值,就改变了其所指向地方的内容。采用指向const对象的指针,可以保护指针指向的值不变。

如果将形参定义为const类型,实参可以是const对象或者是非const对象,这是因为编译器会将const形参声明为普通的int型。

使用引用形参可以弥补复制形参的不足,比如需要改变实参值的情况。与引用一样,引用形参直接关联到其所绑定的对象,在调用函数时,引用形参直接与相应的实参关联绑定(引用形参只是一个马甲)。可以在函数定义中加入一个形参来增加一个返回值。

再向函数传递大型对象时,利用const引用避免复制,与此同时,const又保证了实参不发生改变。最好将不需要修改的引用形参定义为const引用。

指向指针的引用:int *&v,从右至左结合,v首先是个引用,其次其与一个int型指针相关联

在使用数组名字的时候,数组名会自动转化为指针,所以通过操作指针来处理数组的函数。如果将数组形参生命为引用,则不换转换为指针进行处理,而是传递数组的引用本身,此时需检查实参与形参大小是否匹配。对于多维数组,因为其每个元素本身均为数组,所以多维数组的列数,也即各个元素的长度均为元素类型的一部分,void abc(int (*a)[10])将a声明为了指向10个int型元素的数组的指针,其实也就相当于指针的指针。

非引用数组的传递,只检查类型是否匹配,而不考虑数组的大小是否一致。这样会遇到数组长度是否超出的问题,有3种解决办法:1、在数组末尾放置一标志位以防止超出 2、在函数形参中包括数组的首元素,以及最后一个元素的后一个元素,类似于遍历vector。3、在函数形参中添加数组的长度。

函数返回值为引用时,返回一个左值,所以其可以被赋值。

函数的声明由函数返回类型、函数名和形参列表组成,形参列表必须包括形参类型,在函数声明中,不必对形参命名,这三个元素构成了函数的接口。

如果在形参表中对形参进行了明确的赋值,其转化为默认实参,也就是在调用函数时,可以省略赋值。函数调用时,默认实参从列表尾部开始替换,也就是说,若希望为后边的实参赋值,则其前面的必须赋值。而且在一个文件中,只能为默认实参赋一次值。

在默认情况下,局部变量和形参为自动对象,局部变量、形参只在定义的函数块内存在,每次函数调用时创建,调用结束时撤销

静态局部对象,static关键字定义,它们也存在于函数块中,但是他们在函数调用之前,就已经创建,知道整个程序结束才撤销。

对于一些经常需要调用的短函数来说,将其声明为内联函数更方便。通过在函数返回类型前加上inline可以将其变为内联函数。内联函数是该函数在编译的时候,仅使用其被调用的那一部分,忽略函数其他的执行开销。内联函数的定义必须放在头文件中。

类的成员函数与普通函数的构成一样,成员函数的声明必须在类中,即类圆形必须在类中,而成员函数体的定义可以放在类外。

成员函数中隐藏的this指针指向调用该函数的对象的地址,其在类函数的定义中是隐藏的,任何不加前缀地使用类成员,都默认this调用。形参表之后的const是为了标明this的类型。

如果在类外定义成员函数,定义与声明必须完全一致,函数名要用“::”域操作符来表明其从属。
构造函数是特殊的成员函数,它和类同名,没有返回值类型,完成类成员的初始化。他有多种重载形式,可以有多种形参的配合方法。
class abc
{
   public:
   abc():xxx{}
}其中“:”与“{”之间的部分是类成员的初始化值。
函数的重载就是相同的函数名,不同的形参表,重载的函数应该在同一个作用域中声明,一般的作用域规则同样适用于重载。仅当形参是引用或指针时,形参是否为const才有影响。当形参以复件的形式传递时,const不影响。
函数指针指向某个特定的函数类型,函数类型有返回值类型即形参表决定:bool (*p)(int a,int *b);表示一个指向函数的指针p,这个函数带有一个int型形参和一个int指针形参并返回一个bool值。可以用typedef来简化这个指针的表示:typedef bool (*pf)(int a,int *b);pf就表示这个函数指针类型。这个类型是“指向一个带有一个int型形参和一个int指针形参并返回一个bool值的函数的指针”。在引用函数名却没有调用这个函数时,函数名自动转换为指向函数的指针。并等效于在函数名前加上地址符“&”。函数必须通过同类型的函数、函数指针或0来初始化。已经初始化的指向函数的指针可以直接调用函数。函数可以返回指向函数的指针:int (*ff(int)) (int*,int);阅读函数指针声明的最佳方法是从声明的名字开始由里向外。声明的名字为ff,则ff(int)为带有int型形参的函数,去掉它之后,变为int (*) (int *,int)这是一个返回值为int型并带有一个int型形参和一个int指针形的指向函数的指针。使用typedef更容易理解,即为:pf  ff(int);
函数型的形参所对应的实参将自动转换为相应函数类型的指针。
指向函数的指针类型必须与重载函数完全一样才可以重载。

原创粉丝点击