首页 > 编程语言 >C++零基础教程(函数重载)

C++零基础教程(函数重载)

时间:2023-10-19 20:33:07浏览次数:45  
标签:函数 C++ 类型 参数 基础教程 重载 函数指针 foo

(文章目录)


前言

本篇文章来讲解函数重载,函数重载在C++中是非常重要的一个概念。

一、概念讲解

C++中的函数重载是指在同一个作用域中定义多个具有相同名称但参数列表不同的函数。函数重载允许使用相同的函数名来表示执行类似但具有不同参数类型或参数数量的操作。这样做可以提高代码的可读性和灵活性,使程序员更加方便地调用适合不同情境的函数。

函数重载的特点如下:

1.函数名称相同:重载函数的名称必须相同。

2.参数列表不同:重载函数的参数列表必须有所区别,例如参数的类型、个数或顺序不同。

3.返回类型不同:函数的返回类型不能作为重载函数的区别,因为编译器无法只根据返回类型确定要调用哪个函数。其他的仅返回类型不同的重载函数是非法的。

二、代码示例

#include <iostream>

// 函数重载示例
void print(int num) {
    std::cout << "Integer: " << num << std::endl;
}

void print(double num) {
    std::cout << "Double: " << num << std::endl;
}

void print(const char* str) {
    std::cout << "String: " << str << std::endl;
}

int main() {
    int a = 10;
    double b = 3.14;
    const char* c = "Hello";

    print(a);  // 调用 print(int) 函数
    print(b);  // 调用 print(double) 函数
    print(c);  // 调用 print(const char*) 函数

    return 0;
}

在上述示例中,我们定义了三个名为 print 的函数,参数列表分别为 int、double 和 const char*。尽管它们具有相同的名称,但由于参数列表的不同,它们是多个不同的函数。在 main 函数中,我们调用了不同版本的 print 函数,根据传递的参数类型的不同,编译器可以正确地选择要调用的函数。

函数重载使得编程更加方便,可以根据不同的需求使用相同的函数名来表示不同的功能。但需要注意的是,函数重载需要具备明显的区别,以便编译器在调用函数时可以准确地匹配到正确的函数版本

三、函数指针遇到函数重载

函数指针在处理函数重载时需要注意,因为函数指针的类型必须与要指向的函数的类型完全匹配。以下是一个具有函数重载的函数指针的示例代码:

#include <iostream>

void foo(int num) {
    std::cout << "I'm foo(int): " << num << std::endl;
}

void foo(double num) {
    std::cout << "I'm foo(double): " << num << std::endl;
}

int main() {
    void (*ptr)(int); // 定义一个指向接受 int 参数的函数的函数指针

    ptr = foo; // 将函数指针指向 foo(int)

    ptr(10); // 调用 foo(int)

    return 0;
}

在上述示例中,我们定义了两个重载函数 foo,一个接受 int 参数,另一个接受 double 参数。在 main 函数中,我们定义了一个函数指针 ptr,它被声明为指向接受 int 参数的函数的指针类型 void (*)(int)。然后,我们将函数指针 ptr 指向 foo 函数,即 ptr = foo;。由于 ptr 指向的是 foo(int),因此在调用函数指针时,我们可以传递一个 int 类型的参数。

请注意,函数指针的类型必须与所指向函数的类型匹配。因此,如果我们尝试将函数指针 ptr 指向 foo(double),即 ptr = foo;,这将导致类型不匹配的错误,因为函数指针 ptr 的类型是指向接受 int 参数的函数的指针类型。

如果需要使用函数指针来引用重载函数,可以选择使用类型转换来显式指定函数指针的类型,以确保匹配正确的函数重载版本。例如,可以使用以下方式来引用 foo(double):

void (*ptr)(double);
ptr = reinterpret_cast<void (*)(double)>(foo);
ptr(3.14); // 调用 foo(double)

但请谨慎使用类型转换来避免潜在的类型安全问题。在处理函数重载时,函数指针的使用可能更加复杂,需要注意类型匹配和明确的函数指针类型

总结

本篇文章就讲解到这里,希望大家好好总结一下。这里我列出一些关键点:

1.函数名相同:重载函数必须使用相同的函数名。

2.参数列表不同:重载函数的参数列表必须不同,可以有不同的参数类型、参数个数或参数顺序。

3.返回类型不同:重载函数可以具有不同的返回类型,但仅仅改变返回类型不足以满足函数重载的要求,必须与其他参数列表不同。

4.在相同作用域内定义:重载函数必须在相同的作用域内定义,可以是全局作用域或类的成员函数。

标签:函数,C++,类型,参数,基础教程,重载,函数指针,foo
From: https://blog.51cto.com/u_16153875/7942077

相关文章

  • LM拟合 C++
    未完成#include<iostream>#include<vector>#include<array>#include<ctime>#include<random>usingnamespacestd;voidCalc_J_fx(vector<array<double,2>>&data, double&k, vector<double......
  • C++
    1.什么是引用?简单来说就是给一个变量起别名。(本质是一个指针常量)当编译器遇到int&a=b;时,自动转成int*consta=&b,然后遇到a时编译成*a用法:数据类型&引用名=变量名inta=10;int&b=a;//b与a代表同一个数据注意①引用必须要初始化。int&b;//错误②引用一旦初始化后,就不能再更改......
  • C++ 模板特化与偏特化:解析与应用
    引言在C++中,模板是一种非常强大的特性,它们允许我们编写通用、可重用的代码。但有时,我们需要为某些特定的数据类型或类提供特殊的实现,这时就需要使用到模板特化(TemplateSpecialization)和模板偏特化(PartialTemplateSpecialization)。本文将深入探讨这两者的概念、用法和注意事项......
  • 多源最短路径的原理及C++实现
    时间复杂度O(n3),n是端点数。核心代码template<classT,TINF=1000*1000*1000>classCNeiBoMat{public:CNeiBoMat(intn,constvector<vector<int>>&edges,boolbDirect=false,boolb1Base=false){m_vMat.assign(n,vector<int>......
  • 存在负权边的单源最短路径的原理和C++实现
    负权图此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。负环图 但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。经过k条边的最短距离(可能有负权变)贝尔曼福特算法(bellman_ford)就是解决此问题的。原理循环k次,循环第i次时,m_vDis表示各点最多经过i-1条边的最短距离;v......
  • 堆优化迪氏最短单源路径原理及C++实现
    时间复杂度O(ElogE),E是边数。适用与稀疏图。使用前提边的权为正。可以非连通,非连通的距离为-1。原理优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。先处理距离小的点;如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。优先队列只记录如下情况的距离:一,{0,源点}。二,......
  • 有向图计数优化版原理及C++实现
    题目见前面章节。有向图访问计数的原理及C++实现第一版不需要拓扑排序,也不需要并集查找,直接dfs了。完成以下三个职责:一,DFS那些端点在环上。二,DFS环上各点此环的长度。三,DFS非环上各点。分析cur是当前dfs的节点,next为edges[cur]。从后向前分析:判定处理ret的值返回值找到环尾ret......
  • 朴素迪氏最短单源路径的原理及C++实现
    Dijkstra算法,翻译为迪杰斯特拉或狄克斯特拉。在下驽钝,记不住如此长的翻译,故简称迪氏。时间复杂度O(n2),端点数的平方。使用前提边的权为正。可以非连通,非连通的距离为-1。原理源点到源点的最短路径只有一个节点{s}。除源点本身外,其它端点的最短路径至少有两个端点,整个路径{s...x2}可......
  • 有向图访问计数的原理及C++实现
    题目现有一个有向图,其中包含n个节点,节点编号从0到n-1。此外,该图还包含了n条有向边。给你一个下标从0开始的数组edges,其中edges[i]表示存在一条从节点i到节点edges[i]的边。想象在图上发生以下过程:你从节点x开始,通过边访问其他节点,直到你在此过程中再次......
  • 重写和重载
    2023.10.181.classA{publicAfoo(){returnthis;}}classBextendsA{publicAfoo(){returnthis;}}classCextendsB{_______}可以填入哪个而不报错Apublicvoidfoo(){}Bpublicintfoo(){return1;}Cpubli......