C++ -- 函数的高级用法

1, 内联函数

  • 代码量小(1 - 5行), 无复杂逻辑(if, while等), 这样的函数适合作为内联函数
  • 优点:内联函数在调用时,直接用函数代码替换函数调用,避免频繁出入栈, 提高执行效率, 以空间换时间
  • 用法:在函数声明或函数实现时,在函数前加关键字 inline 注意:内联函数的声明和实现必须写在同一个文件中(可以写在头文件中)
  • 内联函数必须是和函数体声明在一起,才有效。 使用 inline 关键字只是建议编译器把这个函数当作内联函数处理 但是决定权在编译器, 如果这个函数太复杂, 不适合作为内联函数, 那么编译器还是把它当作普通函数

2, 函数重载

  • 在C语言中, 函数名都是唯一的, 若有函数重名, 则无法编译
  • 但在c++中, 函数名可以相同, 只要函数的形参列表不同, 这就是两个函数
  • 因为编译器在编译器, 把函数的参数也提取出来了
  • 例如
  • C语言中, 编译时函数被提取为_swap
    C++中, 被提取为_swap_int_int
    所以只要形参列表不同, 这就是两个函数

3, 函数的默认参数

  • 在C++中, 函数可以有默认参数
  • 例如: int add(int a = 10; int b = 20; int c = 30) {return a+b+c};
  • 注意: 默认参数只能在函数定义处添加
  • 默认参数的添加必须从右往左
    因为添加默认参数的目的是为了减少传参
    而函数参数是从左往右匹配的
    例如: int add(int a = 10; int b = 20; int c) {return a+b+c};
    此时如果 add(1, 2); 那么第三个参数c就没有值, 肯定就会报错
    如果 add(1, 2, 3); 那么设置默认参数就没有意义了,因为还是必须传3个参数
    注意: 在重载函数中使用默认参数要特别注意

4,函数传参的总结

  • 基本类型(int char double)和枚举类型一般用值传递
  • 结构体, 类的对象一般用指针或引用传递
  • 数组类型一般用指针传递
  • 小技巧: 当函数参数超过7个以上, 比较多的时候, 可以把它封装在一个结构体中
    然后传指针或引用

测试代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include "inline.h"

using namespace std;

//1,内联函数
    //代码量小(1 - 5行), 无复杂逻辑(if, while等), 这样的函数适合作为内联函数
    //优点:内联函数在调用时,直接用函数代码替换函数调用,避免频繁出入栈, 提高执行效率, 以空间换时间
    //用法:在函数声明或函数实现时,在函数前加关键字 inline
    //注意:内联函数的声明和实现必须写在同一个文件中(可以写在头文件中)
    //内联函数必须是和函数体声明在一起,才有效。
    //使用 inline 关键字只是建议编译器把这个函数当作内联函数处理
    //但是决定权在编译器, 如果这个函数太复杂, 不适合作为内联函数, 那么编译器还是把它当作普通函数
inline void getInfo();

inline void getInfo()
{
    cout << "我可能是一个内联函数" << endl;
    cout << "hello, world" << endl;
}


//2,函数重载
    //在C语言中, 函数名都是唯一的, 若有函数重名, 则无法编译
    //但在c++中, 函数名可以相同, 只要函数的形参列表不同, 这就是两个函数
    //因为编译器在编译器, 把函数的参数也提取出来了
    //例如: C语言中 编译时函数被提取为_swap
    //      C++中, 被提取为_swap_int_int
    //所以只要形参列表不同, 这就是两个函数
//void swap(int* x, int* y)
//{
//  cout << "传址调用" << endl;
//  int tmp = *x;
//  *x = *y;
//  *y = tmp;
//}
//void swap(int& x, int& y)
//{
//  cout << "传引用调用" << endl;
//  int tmp = x;
//  x = y;
//  y = tmp;
//}

//3,函数的默认参数
    //在C++中, 函数可以有默认参数
    //例如: int add(int a = 10; int b = 20; int c = 30) {return a+b+c};
    //注意: 默认参数只能在函数定义处添加
    //      默认参数的添加必须从右往左
    //因为添加默认参数的目的是为了减少传参
    //而函数参数是从左往右匹配的
    //例如: int add(int a = 10; int b = 20; int c) {return a+b+c};
    //      此时如果 add(1, 2) 那么第三个参数c就没有值, 肯定就会报错
    //      如果 add(1, 2, 3) 那么设置默认参数就没有意义了,因为还是必须传3个参数
    //注意: 在重载函数中使用默认参数要特别注意
void swap(int* x, int* y)
{
    cout << "传址调用" << endl;
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

void swap(int& x, int& y)
{
    cout << "传引用调用" << endl;
    int tmp = x;
    x = y;
    y = tmp;
}

//void swap(int& x, int& y, bool judge = false)
//{
//  cout << "重载函数设置默认参数要特别注意" << endl;
//  if(judge)
//  {
//      int tmp = x;
//      x = y;
//      y = tmp;
//  }   
//}

//4,函数传参的总结
    //基本类型(int char double)和枚举类型一般用值传递
    //结构体, 类的对象一般用指针或引用传递
    //数组类型一般用指针传递
    //小技巧: 当函数参数超过7个以上, 比较多的时候, 可以把它封装在一个结构体
    //        然后传指针或引用




int main()
{
    //getInfo();
    int a = 100;
    int b = 200;
    cout << "a = " << a << " b = " << b << endl;
    swap(&a, &b);
    cout << "a = " << a << " b = " << b << endl;
    swap(a, b); //此时调用会出错. 因为有一个swap函数有了默认参数, 所以就不知道是要调用哪一个了
    cout << "a = " << a << " b = " << b << endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_36629696/article/details/80036650