函数基础
函数的前置声明
只需写出返回值类型和参数列表类型,不需写出参数名称。应为参数名称只有在函数内使用参数时才是必要的。
bool fun1(int, int &);
传址/值(Pass By Reference/ Value)
引用为对象的别名,两者在内存中地址相同。引用必须在初始化时赋值。
int a = 1;
int &ra = a;
C++不允许改变引用所代表的对象
int a = 1;
int b = 2;
int &r = a;
r = b; // get value of 2 to r/a
当以by reference方式将对象作为函数参数传入时,对象本身并不会复制出一份——复制的是对象的地址。使用理由如下:
- 希望直接对传入的对象修改
- 降低复制大型对象的额外负担
除非希望在函数内更改参数值,否则建议在传递内置类型时,不要使用传址方式。传址机制主要用于传递class object
提供默认参数值
如果我们为某个参数提供了默认值,那么这一参数的右侧所有参数也必须有默认值
默认值只能指定一次,可在前置声明处或定义处。为了提高可读性,将默认值放在前置声明处
局部静态对象
不应为了节省函数间通信的问题而将对象定义在file scope内,其会打乱不同函数间的独立性,使它们难以理解,可使用static声明。使用static声明的对象即使在不同的函数调用中依然存在。
static int age = 10
inline函数
为改善性能,将体积小,常被调用,不复杂的函数可以合并为一个。通过inline函数声明其中的主函数,要求编译器在每个函数调用点上,将函数的内容展开。
inline bool fibon_elem( int pos, int &elem)
inline函数的定义常放在头文件中。
重载函数
参数列表不同(类型或个数)的有相同名称的函数。
编译器无法根据返回值类型来区分同名函数。
模板函数
函数主体不变,只改变用到的数据类型,可以用function template实现
template <typename elemType> # elemType or other name
void display_message( const string &msg, const vector<elemType> &vec)
函数指针
指向函数的指针,用于将函数作为参数传递
float norm_l1(float x, float y);
float norm_l2(float x, float y);
//define
float (*norm_ptr)(float x, float y);
//assignment
norm_ptr = norm_l1;
norm_ptr = &norm_l2;
//declare
float len1 = norm_ptr(-3.0f, 4.0f);
float len2 = (*norm_ptr)(-3.0f, 4.0f);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。