您的位置:首页 > 编程语言 > C语言/C++

c++ primer 复习-函数

2015-08-22 14:25 393 查看
学到动态内存的时候,出现许多使用函数尤其是类的相关知识的应用,因练习量不足,知识出现遗忘,继续学习颇感吃力。因此决定在向下学习之前,先开始第一轮复习,将重要的知识系统梳理一遍,以便完成后续的学习内容。

1.参数传递

①参数传递的方法有2种:传值参数、传引用参数。

a.传值参数:

对于整形此类,就是形参拷贝实参,对形参的改变不影响实参;对于指针形参,拷贝的是指针本身,这样一来形参和实参指向相同的对象,解引用后可以修改对象,但是当然了,还是需要拷贝,只不过拷贝的是指针,但是相比较整形这种,它可以修改对象。

b.传引用参数:

对于大的类类型对象、容器对象而言,拷贝会比较低效,而且对于一些类类型(如IO类型)根本不支持拷贝操作(结合第八章看)。这种情况下引用形参访问对象就显得更为好用。

此外,利用引用参数,可以实现多返回的功能。

②const形参和实参

首先,根据第二章关于顶层、底层const的讨论,在将顶层const赋值给非顶层的过程中,顶层const是可以忽略的。所以 ,用实参初始化形参时会忽略掉顶层const。基于此,有一个非常有用的内容:当形参有顶层const的时候,传给它常量对象或非常量对象都是可以的,而这样就增加了函数输入参数的范围,但需要注意,顶层const不支持重载。
其次,可以使用非常量初始化一个底层const,比如const int &r=i;指针类似。要注意区分底层和顶层!例如把const int *传递给int *就不行,这就属于把底层const传给非const,而底层const不可忽略而导致错误的情形。
所以应该尽量使用const引用!

③数组形参

数组有两个特殊属性:不允许拷贝->无法使用值传递、使用数组时(通常)会将其转换成指针->向函数传递数组实际上传递的是指向数组首元素的指针

形参既可写成指针形式,也可写成数组形式,维度可省略表输入维度期望。

管理指针(数组)形参的三种技术:

a.标记指定数组长度:适用于C风格字符串,可对指针做if判断,遇到结束标记可跳出循环等等。对于int数组这种不好用了。

b.(最优且普适的方法)标准库规范:iterator头文件中的可对数组使用的迭代器,例如:print(begin(a), end(a));通过这种方法可对数组进行类似容器的操作。

c.显式传递一个表示数组大小的形参,size_t。

数组引用形参(较难掌握):要注意写成void print(int (&arr)[10])这种,加括号,不然就成了引用的数组,此处是数组的引用、数组的别名,可以range for迭代。

④可变形参

c++ 11,initializer_list标准库类型,可以处理不同数量实参。
省略符形参,将不对省略符对应的实参进行类型检查。

2.返回类型和retuen语句

①返回值或引用

a.不要返回局部对象的引用或指针(拷贝可以return,或者函数之前已经存在的对象的引用或指针)。

b.如果函数返回指针、引用、类的对象,就可以使用函数调用的结果访问成员。

c.函数可以返回花括号包围的值的列表。如果返回类型是个vector,就可以返回{}这种,当然关联容器中也有相类似内容。

②返回数组指针

函数可以返回数组的指针或引用,通常采用类型别名来简化这一过程。利用尾置返回类型方便书写复杂返回类型。如果利用decltype就更方便了。

3.函数指针

①关于typedef的补充(用于函数指针作为形参时简化问题的类型别名)

如typedef bool (*Funcp) (const string &, const string &);
它表示为类型bool (*) (const string &, const string &)起了一个别名叫Funcp。

②为了进一步简化,常使用decltype,但是不会将函数类型自动转换成指针类型,需要在结果前面加一个*才能得到指针。

③返回指向函数的指针

a.还是要用类型别名来简化。当然,返回类型不会自动的转换为指针,依旧要显式将返回类型指定为指针,除非类型别名里已经表示出其指针属性。
b.这种形式直接声明:int (*f1(int)) (int*, int);
c.尾置返回类型:上面的等价为auto f1(int) ->int (*) (int*, int);
d.利用decltype获取返回类型。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: