C++基础知识(六)函数
2013-10-25 14:25
323 查看
c++中的函数和c语言中的函数相比,增加了许多新的语法与功能。在这里总结一下c++中常用的引用参数,函数重载和内联函数。
1、引用参数
说起引用参数最常用的一个例子就是交换两个数,如下:
这样两个数f和s的值就被调换了。是什么原因呢?原来引用参数是利用了别名技术,在进行参数传递时,形式参数作为实际参数的别名绑定于实际参数上。函数中所进行的操作就直接在实际参数上操作。
还有一种交换两个数的方法是利用指针,在c语言中是一个非常经典的例子:
由于传递进来的是实际参数的地址,可以利用这个地址直接对该地址上存储的内容进行修改。因此就交换了两个数的值。
引用参数还有一个作用是引用返回。当程序执行到return expression;这条语句时,会先将expression求值,然后将这个值复制到临时存储空间,最后再将临时存储空间中的这个值返回给调用者,我们称之为传值返回。而引用返回直接将expression求得的值返回给调用者。如:
直接将i的值返回给j,没有经过临时存储空间。
值得注意的是,引用返回并不能返回非static类型的局部变量。因为引用返回,返回的是一个实际的内存单元,必须保证函数结束时,该内存单元仍然存在。
2、内联函数
内联函数使用关键字inline来声明,如:
使用内联函数的目的是减少程序调用的开销,这是因为在调用内联函数的地方,编译器都会将之替换为函数体的代码。这与宏的使用有些相似,但是宏展开式在预处理阶段进行的,不涉及语义处理。而内联函数是由编译器处理的,需要考虑到语义。另外需要强调的一点是c++中的函数允许使用默认的参数,如上例中,就使用了默认的参数,当发生函数调用时,如果没有传递参数就按照默认的参数来处理。
3、函数重载
在讨论函数重载之前,首先介绍一下函数签名的概念:函数签名包括函数名称,参数个数,参数类型,参数顺序。下举例说明:
以上两个函数具有不同的签名,因为他们的名字不同。
以上两个函数签名不同,因为他们虽然有相同的名字,但是他们的参数个数不同。
以上两个函数的签名不同,因为他们的参数类型不同。
以上两个函数签名不同,也因为他们虽然有相同的函数名和个数相同的参数,但是参数的顺序不同。
以上两个函数具有相同的签名,因为他们的函数签名相同。需要注意的是,函数的签名并不包括函数的返回值。
函数的重载存在于具有相同的函数名,具有不同的函数签名的函数之间。如
就是函数重载。函数重载的作用主要是为一些相似的操作提供相同的函数名。就介绍到这里吧。
1、引用参数
说起引用参数最常用的一个例子就是交换两个数,如下:
void swap(int& a,int& b) { int t = a; a = b; b = t; } void main() { int f = 1; int s = 2; swap(f,s); }
这样两个数f和s的值就被调换了。是什么原因呢?原来引用参数是利用了别名技术,在进行参数传递时,形式参数作为实际参数的别名绑定于实际参数上。函数中所进行的操作就直接在实际参数上操作。
还有一种交换两个数的方法是利用指针,在c语言中是一个非常经典的例子:
void swap(int* a,int* b) { int t = *a; *a = *b; *b = t; }
由于传递进来的是实际参数的地址,可以利用这个地址直接对该地址上存储的内容进行修改。因此就交换了两个数的值。
引用参数还有一个作用是引用返回。当程序执行到return expression;这条语句时,会先将expression求值,然后将这个值复制到临时存储空间,最后再将临时存储空间中的这个值返回给调用者,我们称之为传值返回。而引用返回直接将expression求得的值返回给调用者。如:
int& val() { ...... return i; } int j = val();
直接将i的值返回给j,没有经过临时存储空间。
值得注意的是,引用返回并不能返回非static类型的局部变量。因为引用返回,返回的是一个实际的内存单元,必须保证函数结束时,该内存单元仍然存在。
2、内联函数
内联函数使用关键字inline来声明,如:
inline void print(string s="hello world")
使用内联函数的目的是减少程序调用的开销,这是因为在调用内联函数的地方,编译器都会将之替换为函数体的代码。这与宏的使用有些相似,但是宏展开式在预处理阶段进行的,不涉及语义处理。而内联函数是由编译器处理的,需要考虑到语义。另外需要强调的一点是c++中的函数允许使用默认的参数,如上例中,就使用了默认的参数,当发生函数调用时,如果没有传递参数就按照默认的参数来处理。
3、函数重载
在讨论函数重载之前,首先介绍一下函数签名的概念:函数签名包括函数名称,参数个数,参数类型,参数顺序。下举例说明:
int a(int f); int b(int f);
以上两个函数具有不同的签名,因为他们的名字不同。
int a(); int a(int f);
以上两个函数签名不同,因为他们虽然有相同的名字,但是他们的参数个数不同。
int a(int f); int a(double f)
以上两个函数的签名不同,因为他们的参数类型不同。
int a(int f,double s); int a(int s,double f);
以上两个函数签名不同,也因为他们虽然有相同的函数名和个数相同的参数,但是参数的顺序不同。
double a(int s,double d); void a(int dd,double ss);
以上两个函数具有相同的签名,因为他们的函数签名相同。需要注意的是,函数的签名并不包括函数的返回值。
函数的重载存在于具有相同的函数名,具有不同的函数签名的函数之间。如
void print(); void print(string s);
就是函数重载。函数重载的作用主要是为一些相似的操作提供相同的函数名。就介绍到这里吧。
相关文章推荐
- C/C++基础知识:函数指针和指针函数的基本概念
- [C++]基础知识---函数
- 【C++】基础知识—内联(置)函数及register关键字
- C++_函数模板基础知识
- C++的基础知识(十六)--在字符串copy函数中引入辅助指针变量
- 一段小学信息技术基础知识的C++源程序: 函数,输入输出,数据类型,循环
- C++基础知识复习--结构体类数组作为函数参数
- 【一问一答】c++基础知识 ||类,模版,多态,虚函数
- C/C++基础知识:函数指针和指针函数的基本概念
- c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)
- C/C++基础知识总结——函数
- C++的基础知识(十一)--数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- C++_函数模板基础知识
- C++ 基础知识点 九 第10章 多态性与虚函数
- C++基础知识——二维数组做函数参数
- C/C++基础知识:函数指针和指针函数的基本概念
- C/C++基础知识:函数指针和指针函数的基本概念
- C++ 基础知识点 四 第5章 C++函数与程序结构
- c++基础知识,有现成的函数不用,非的自己设计算法,这不是坑爹吗?
- 【C++】类和对象--基础知识+四个默认成员函数+运算符重载