函数基础

函数的前置声明

只需写出返回值类型和参数列表类型,不需写出参数名称。应为参数名称只有在函数内使用参数时才是必要的。

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);

子非鱼
1 声望0 粉丝

CS毕业生,现就职于上海某自动驾驶公司