C++ primer (5th) 随想与学习笔记 8
2014-06-30 17:23
369 查看
第六章 函数
函数就是给定地址的代码块。6.1 函数基础
实参和形参要数量和类型一致,但没规定求值顺序。没有形参的函数可以写成<span style="font-size:14px;">void f1(){/*...*/} //隐式的定义空形参列表 void f2(void){/*...*/} //显式的定义空形参列表</span>
即使类型一样,也要分开声明
<span style="font-size:14px;">int f3(int v1, v2){/*...*/} //错误 int f3(int v1, int v2){/*...*/} //正确</span>函数外的局部变量不能使用与函数形参一致的名字?可以有未命名的形参,但调用时必须提供实参。
函数声明也称为函数原型(Function prototype),声明中最好用上名字,方便理解函数功能。与声明变量一样,函数原型也应该放在头文件里。C++语言支持分离式编译!
6.2 参数传递
实参被引用传递(passed by reference)的函数叫做传引用调用(called by reference);实参被值传递(passed by value)的函数叫做传值调用(called by value)。C语言中经常通过指针类型的形参访问外部对象,在C++中建议使用引用类型。对无须改变引用形参的值将其声明为常量引用。形参可以辅助return返回多个值。
可以使用非常量初始化一个底层const对象,但反过来不行
<span style="font-size:14px;">int i = 42; const int &r = i;\\正确 int &r1 = r;\\错误 int &r2 = 42;\\错误 int r3 = r;\\正确 只是拷贝了一个副本</span>
字面值不能初始化非常量引用,但可以初始化常量引用。
main()函数使用的实参是从argv[1]开始的,argv[0]代表的是程序的名字。有三种可以含有可变形参函数的方法,initializer_list模板、来自C语言的省略符和可变参数模板。
6.3 返回类型和return语句
不要返回局部对象的引用和指针。返回类型是引用的函数可以作为左值。返回数组指针的函数的声明格式为
<span style="font-size:14px;"><span style="font-size:14px;">Type (*function(parameter_list))[dimension]</span></span>
C++11新标准添加了尾置返回类型,如返回含有十个整数数组的指针或引用,可写为
<span style="font-size:14px;"><span style="font-size:14px;">auto fun(int i) -> int(*)[10]</span></span>
6.4 函数重载
重载函数是形参个数和形参类型不同,和返回类型无关。没必要为减轻命名负担而使用重载函数。C++语言中名字查找发生在类型检查之前,因此发现局部声明就会忽略全局声明。
6.5 特殊用途语言特性
默认实参、内联函数和constexpr函数。局部变量不能作为默认值,默认实参的名字在函数声明的作用域解析,而名字的求值在函数调用时
<span style="font-size:14px;">// wd、def和ht的声明必须出现在函数之外 sz wd = 80; char def = ' '; sz ht(); string screen(sz = ht(), sz = wd, char = def); string window = screen();// 调用 screen(ht(), 80, ' ') void f2() { def = '*';//改变默认实参的值 sz wd = 100;//隐藏了外层定义的wd,但是没有改变默认值 window = screen();//screen(ht(), 80, '*') }</span>注意第二个“80”没有改变!
内联函数就是在编译的时候在调用出展开,对优雅简短的代码有效果,但很多编译器不支持内联递归函数。
constexpr表示能用于常量表达式,但不代表返回常量。constexpr函数体中有且只有一条return语句。
6.6 函数匹配
函数重载是时,尽量不要用到隐式强制类型转换,虽然可以。若用到那就说明我们的形参设计的不够合理。6.7 函数指针
函数在调用时自身就是指针。终于把这章看完了,挺难的,细节很多,和C语言差别越来越大了,下面一章就要进入类类型了。
相关文章推荐
- C++ primer (5th) 随想与学习笔记 3 小试牛刀管中窥豹
- C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放
- C++ primer (5th) 随想与学习笔记 6 优先级晦涩难通 新标准更清晰
- C++ primer (5th) 随想与学习笔记 2 怎样在Linux上安装GCC
- C++ primer (5th) 随想与学习笔记 7 执行流程永不变 新标准添精彩
- C++ primer (5th) 随想与学习笔记 1 谈谈坚持的方法与意义
- C++ primer (5th) 随想与学习笔记 4 基本类型很全面 新标准更灵活
- C++ Primer 5th Chapter 7 学习笔记
- C++ Primer 5th Chapter 1 学习笔记
- const笔记(学习c++ primer 5th)
- C++ Primer 5th Chapter 5 学习笔记
- C++ Primer 5th Chapter 9 学习笔记
- C++ Primer 5th Chapter 4 学习笔记
- <C++ Primer 5th 学习笔记>1
- C++ Primer 5th Chapter 8 学习笔记
- C++ Primer 5th Chapter 3 学习笔记
- C++ Primer 5th Chapter 2 学习笔记
- C++ Primer学习笔记:引用的使用注意事项
- C++ primer 学习笔记(1)
- C++ Primer学习笔记:基本编译方法