C++深入分析讲解函数与重载知识点

目录
  • 函数的默认(缺省)参数
    • 1、默认参数的定义
    • 2、默认参数的注意点
  • 占位参数
    • 1、占位参数 函数内部无法使用
    • 2、占位参数 可以设置成缺省参数
  • 函数重载

函数的默认(缺省)参数

1、默认参数的定义

c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有传递该参数值,编译器会自动用默认值代替。

//函数的默认参数 指定x的默认值为10 y为20
int my_add(int x=10,int y=20)
{
    return x+y;
}
void test02()
{
    //如果函数传参 那么各自的默认参数将无效
    cout<<"my_add = "<<my_add(100,200)<<endl;//300
    //如果某个参数未被传参 将启用默认值x=100 y使用默认值20
    cout<<"my_add = "<<my_add(100)<<endl;//120
    //x=10  y=20
    cout<<"my_add = "<<my_add()<<endl;//30
}

2、默认参数的注意点

(1)、函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都必须设置默认参数

//函数的默认参数从左向右
int func01(int x,int y=20,int z=30)
{
    return x+y+z;
}
void test03()
{
    cout<<func01(100,200)<<endl;//330
    cout<<func01(100)<<endl;//150
    //cout<<func01()<<endl;//err x没有设置默认参数 必须传参
}
int fun(int a, int b, int c=10);//正確
int fun(int a, int b=20, int c=10);//正確
int fun(int a=30, int b=20, int c=10);//正確
int fun(int a, int b=20, int c);//不正确

(2)、如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数

(3)、默认参数一般在函数声明的时候 设置

fun.cpp

int func02(int x,int y,int z)
{
    return x+y+z;
}

main.cpp

//分文件 函数定义处的默认参数 是无效的
//建议:分文件是 在声明 给默认参数
extern int func02(int x,int y=25,int z=35);
//extern int func02(int x,int y,int z);//err
void test04()
{
    cout<<func02(100,200)<<endl;//335
    cout<<func02(100)<<endl;//160
}

占位参数

c++在声明函数时,可以设置占位参数。

占位参数只有参数类型声明,而没有参数名声明。

如果函数的参数只有类型名 没有形参名,这个参数就是占位参数

注意:

由于有类型名 所以 函数调用的时候 必须给占位参数传参。

由于没有形参名 所以 函数内部 是无法使用占位参数。

1、占位参数 函数内部无法使用

void func03(int x,int y,int)
{
    cout<<"x = "<<x<<", y = "<<y<<endl;
    return;
}
void test05()
{
    //func03(10,30,"hehe");//err "hehe"和int类型不符
    func03(10,30,40);
}

2、占位参数 可以设置成缺省参数

void TestFunc01(int a,int b,int=100)
{
    //函数内部无法使用占位参数 cout << "a + b = " << a + b << endl;
}
TestFunc01(10, 20,30);//ok
TestFunc01(10, 20);//ok

什么时候用,在后面我们要讲的操作符重载的后置++要用到这个

函数重载

函数重载体现了 c++ 的多态的特性

函数重载:同一个函数名在不同场景下可以具有不同的含义。

函数重载意义:方便的使用函数名。

函数重载的条件: 同一个作用域 参数个数不同 参数类型不同 参数顺序不同(重要)

void myFunc(int a)
{
    cout<<"int的myFunc"<<endl;
}
void myFunc(int a,int b)
{
    cout<<"int,int 的myFunc"<<endl;
}
void myFunc(int a,double b)
{
    cout<<"int , double的myFunc"<<endl;
}
void myFunc(double a,int b)
{
    cout<<"double,int的myFunc"<<endl;
}
void test06()
{
    myFunc(10);//int
    myFunc(10,20);//int int
    myFunc(10,20.2);//int double
    myFunc(10.1,20);//double int
}

注意:

1、函数的返回值类型 不能作为 函数重载的依据。

2、函数重载和默认参数一起使用,需要额外注意二义性问题的产生

void myFunc02(int a)
{
    cout<<"int的myFunc02"<<endl;
}
void myFunc02(int a,int b=10)//默认参数
{
    cout<<"int,int 的myFunc02"<<endl;
}
void test07()
{
    //myFunc02(int a) 和 myFunc02(int a,int b=10)都能识别
    myFunc02(10);//二义性产生
}

3、函数重载的原理(了解)

到此这篇关于C++深入分析讲解函数与重载知识点的文章就介绍到这了,更多相关C++函数与重载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 函数重载背后的原理

    目录 函数重载 函数重载的原理 为何C++可以支持重载 程序的编译链接 C语言为何不支持重载 C++为何可以支持函数重载 C++和C语言相互调用 创建静态库 C++调用C extern “C” extern “C” 原理 C语言调用C++ C++ 注意事项 extern "C"修饰的函数和一个函数完全一样 extern "C"修饰的函数和一个函数构成重载 函数重载 我们可能对函数很是熟悉,但是重载又是什么意思呢?我们先来用一个具体的场景来分享. 一天,张三的老板要你

  • C++超详细讲解函数重载

    目录 1 函数重载的定义 2 构成函数重载的条件 3 编译器调用重载函数的准则 4 函数重载的注意事项 4.1 避开重载带有指定默认值参数的函数 4.2 注意函数重载遇上函数指针 4.3 C++编译器不能以 C 的方式编译重载函数 1 函数重载的定义 函数重载:使用同一个函数名定义不同的函数.从本质上来看,就是互相独立的不同函数,每一个函数类型不同.因此,函数重载是由函数名和参数列表决定的. 注意:函数返回值不能作为函数重载的重要依据! 2 构成函数重载的条件 当满足以下三个条件之一时,便可以构

  • C++超详细分析函数重载的使用

    目录 一.函数重载分析(上) 1.1 重载的定义 1.2 函数重载的定义 1.3 函数重载需要满足的条件 1.4 编译器调用重载函数的准则 1.5 函数重载的注意事项 1.6 小结 二.函数重载分析(下) 2.1 函数重载遇上函数指针 2.2 C++和C的相互调用 2.3 使得C代码只会以C的方式被编译的解决方案 2.4 小结 一.函数重载分析(上) 1.1 重载的定义 定义:同一个标识符在不同的上下文有不同的意义 1.2 函数重载的定义 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时

  • C++深入分析回顾函数重载

    目录 一.函数重载回顾 二.类中的重载 三.重载的意义 四.小结 一.函数重载回顾 函数重载的本质为相互独立的不同函数 C++ 中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 二.类中的重载 类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载? 注意事项 重载函数的本质为多个不同的函数 函数名和参数列表是唯一的标识 函数重载必须发生在同

  • c++核心编程之函数的重载

    目录 1.函数重载概述 2.函数重载的注意事项 1.函数重载概述 ​作用​:函数可以相同,提高复用性 ​函数重载必须满足的条件​: 1​.同一个作用域下​ 2.​函数名称相同​ 3.函数​参数类型不同​或者​个数不同​或者​顺序不同​ ​注意​:函数的返回值不可以作为函数重载的条件 完整代码示例: // 函数重载的条件 //1,在同一个作用域中 //2,相同的返回值类型和函数名 //3,函数的参数个数不同或者参数顺序不同或者参数类型不同 void cunc() {   cout << &quo

  • C++构造函数+复制构造函数+重载等号运算符调用

    目录 前言: 1.赋值和初始化的区别 2.初始化和赋值分别调用哪个函数? 3.编写测试类 前言: 初学C++发现了下面这个问题,其中Duck是一个已知的类,并以多种方式指定对象的值: Duck d1(); Duck d2(d1); Duck d3 = d1; Duck d4; d4 = d1; 问题在于,上述d1.d2.d3.d4是如何创建的呢?分别调用的哪个函数呢? 1.赋值和初始化的区别 C++中,赋值和初始化是两个不同的概念: 初始化是指对象创建之时指定其初值,分为直接初始化和复制初始化两

  • C++深入浅出讲解函数重载

    目录 前言 函数重载 1.1 函数重载的概念 1.2 函数重载的意义 1.3 名字修饰(name Mangling) 1.4 extern "C" 前言 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了. 比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心.一个是乒乓球,一个是男足.前者是“谁也赢不了!”,后者是“谁也赢不了!” 函数重载 1.1 函数重载的概念 函数重载: 它是函数的一种特殊情况,C++允许在同一作用域中同一作用域

  • C++简明分析讲解引用与函数提高及重载

    目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &新变量名 =原来变量名 作用:给变量起别名 注意事项: 1.引用必须初始化 2.一旦初始化就不能更改(具体原因在下面引用本质上会讲到) 示例: int a = 10; int c = 20; 如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址. 所以这样写 int &b=a

  • C++函数重载的定义与原因详解

    目录 引例 函数重载的定义 函数重载规则 为什么C不支持函数重载而C++可以 内部名称 总结 引例 如果要求你只能通过print函数,即能打印字符串,又能打印一个整型. 虽然在C语言中我们可以通过 print_i 和print_s来实现功能. 但是C++更方便.C++支持同一函数名,完成类似的功能的语法. void print(int i) { cout << "print a integer :" << i << endl; } void prin

  • C++深入分析讲解函数与重载知识点

    目录 函数的默认(缺省)参数 1.默认参数的定义 2.默认参数的注意点 占位参数 1.占位参数 函数内部无法使用 2.占位参数 可以设置成缺省参数 函数重载 函数的默认(缺省)参数 1.默认参数的定义 c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有传递该参数值,编译器会自动用默认值代替. //函数的默认参数 指定x的默认值为10 y为20 int my_add(int x=10,int y=20) { return x+y; } void test

  • C++深入分析讲解类的知识点

    目录 知识点引入 类的初识 1.封装 2.权限 3.类的定义(定义类型) 4.类的成员函数与类中声明及类外定义 Person类的设计 设计立方体类 点Point和圆Circle的关系 知识点引入 C语言中 数据 和 方法 是独立: //c语言的思想:数据 方法 分开 //人 typedef struct { char name[32]; int age; }Person; //动物 typedef struct { char name[32]; int age; int type; }Dog;

  • C++深入讲解函数重载

    目录 函数重载 概念 重载依据 值型别 判断函数重载的规则 名字粉碎-名字修饰 函数重载 概念 在C++中可以为两个或者两个以上函数提供相同的函数名称,只要参数类型不同,或者参数数目不同,参数顺序不同,即参数表不同,那么就认为是函数的重载.(函数名+参数表) // my_max + 参数表 int my_max(int a,int b) { return a > b ? a : b; } char my_max(char a,char b) { return a > b ? a : b; }

  • C++深入分析讲解智能指针

    目录 1.简介 2.unique_ptr指针(独占指针) 3.shared_ptr指针(共享所有权) 4.weak_ptr(辅助作用) 5.自实现初级版智能指针 6.总结 1.简介 程序运行时存在静态空间.栈和堆区,用堆来存储动态分配空间的对象即那些在程序运行时分配空间的对象,若该对象不再使用,我们必须显式的销毁它们,避免内存泄漏. 智能指针是一个可以像指针一样工作的对象,有unique_ptr(独占指针),shared_ptr与weak_ptr等智能指针,定义在<memory>头文件中,可以

  • React Hooks核心原理深入分析讲解

    目录 Hooks 闭包 开始动手实现 将useState应用到组件中 过期闭包 模块模式 实现useEffect 支持多个Hooks Custom Hooks 重新理解Hooks规则 React Hooks已经推出一段时间,大家应该比较熟悉,或者多多少少在项目中用过.写这篇文章简单分析一下Hooks的原理,并带大家实现一个简易版的Hooks. 这篇写的比较细,相关的知识点都会解释,给大家刷新一下记忆. Hooks Hooks是React 16.8推出的新功能.以这种更简单的方式进行逻辑复用.之前

  • C++超详细讲解函数对象

    目录 一.客户需求 二.存在的问题 三.解决方案 四.函数对象 五.小结 一.客户需求 编写一个函数 函数可以获得斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 下面来看第一个解决方案: #include <iostream> using namespace std; int fib() { static int a0 = 0; static int a1 = 1; int ret = a1; a1 = a0 + a1; a0 = ret; return ret; } in

  • C++超详细讲解操作符的重载

    目录 一.需要解决的问题 二.操作符重载 三.小结 一.需要解决的问题 下面的复数解决方案是否可行? 下面看一下复数的加法操作: #include <stdio.h> class Complex { int a; int b; public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } int getA() { return a; } int getB() { return b; } friend Comp

随机推荐