c++ primer 复习-函数
2015-08-22 14:25
393 查看
学到动态内存的时候,出现许多使用函数尤其是类的相关知识的应用,因练习量不足,知识出现遗忘,继续学习颇感吃力。因此决定在向下学习之前,先开始第一轮复习,将重要的知识系统梳理一遍,以便完成后续的学习内容。
此外,利用引用参数,可以实现多返回的功能。
其次,可以使用非常量初始化一个底层const,比如const int &r=i;指针类似。要注意区分底层和顶层!例如把const int *传递给int *就不行,这就属于把底层const传给非const,而底层const不可忽略而导致错误的情形。
所以应该尽量使用const引用!
形参既可写成指针形式,也可写成数组形式,维度可省略表输入维度期望。
b.(最优且普适的方法)标准库规范:iterator头文件中的可对数组使用的迭代器,例如:print(begin(a), end(a));通过这种方法可对数组进行类似容器的操作。
c.显式传递一个表示数组大小的形参,size_t。
省略符形参,将不对省略符对应的实参进行类型检查。
它表示为类型bool (*) (const string &, const string &)起了一个别名叫Funcp。
b.这种形式直接声明:int (*f1(int)) (int*, int);
c.尾置返回类型:上面的等价为auto f1(int) ->int (*) (int*, int);
d.利用decltype获取返回类型。
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获取返回类型。
相关文章推荐
- C++内存分配一:C++程序内存的基本组成
- C语言求素数的算法
- C++中将string类型转换为int, float, double类型 主要通过以下几种方式:
- C++ int类型转换string类型
- C++常见面试
- C++面试常见题目问与答(汇总一)
- POJ C++程序设计 编程题#4:魔兽世界之一:备战
- 图解C++
- C#在C++编写的DLL中注册函数并回调
- C语言快排
- C++ Primer 5e chapter 12
- C++ Primer 5e chapter 11
- C++ 与 c# 模块 之间相互调用
- 栈的应用2——超级计算器(中缀与后缀表达式)C语言
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
- C++ 编程个人总结
- C++中 explicit的用法
- GCC在C语言中内嵌汇编 asm __volatile__ (2)
- C语言编程技巧----如何定义全局变量----->提高代码可移植性
- C和C++中的文件读入写出区别