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

目录
  • 一、函数重载回顾
  • 二、类中的重载
  • 三、重载的意义
  • 四、小结

一、函数重载回顾

  • 函数重载的本质为相互独立的不同函数
  • C++ 中通过函数名和函数参数确定函数调用
  • 无法直接通过函数名得到重载函数的入口地址
  • 函数重载必然发生在同一个作用域中

二、类中的重载

类中的成员函数可以进行重载

  • 构造函数的重载
  • 普通成员函数的重载
  • 静态成员函数的重载

问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?

注意事项

  • 重载函数的本质为多个不同的函数
  • 函数名和参数列表是唯一的标识
  • 函数重载必须发生在同一个作用域中

所以类的成员函数和全局函数不能构成重载,因为全局函数位于全局的命名空间当中,而成员函数位于类里面,作用域不一样。

下面看一个重载的示例:

#include <stdio.h>
class Test
{
    int i;
public:
    Test()
    {
        printf("Test::Test()\n");
        this->i = 0;
    }
    Test(int i)
    {
        printf("Test::Test(int i)\n");
        this->i = i;
    }
    Test(const Test& obj)
    {
        printf("Test(const Test& obj)\n");
        this->i = obj.i;
    }
    static void func()
    {
        printf("void Test::func()\n");
    }
    void func(int i)
    {
        printf("void Test::func(int i), i = %d\n", i);
    }
    int getI()
    {
        return i;
    }
};
void func()
{
    printf("void func()\n");
}
void func(int i)
{
    printf("void func(int i), i = %d\n", i);
}
int main()
{
    func();
    func(1);
    Test t;        // 初始化,调用没有参数的构造函数Test(),输出Test::Test()
    Test t1(1);    // Test::Test(int i)
    Test t2(t1);   // Test(const Test& obj)
    func();        // void func()
    Test::func();  // void Test::func()
    func(2);       // void func(int i), i = 2;
    t1.func(2);    // void Test::func(int i), i = 2
    t1.func();     // void Test::func()
    return 0;
}

输出结果如下:

这个例子展示了类中函数的重载以及全局函数的重载,值得多阅读几遍!!

三、重载的意义

  • 通过函数名对函数功能进行提示
  • 通过参数列表对函数用法进行提示
  • 扩展系统中已经存在的函数功能

下面看一个字符串拷贝函数的重载:

#include <stdio.h>
#include <string.h>
char* strcpy(char* buf, const char* str, unsigned int n)
{
    return strncpy(buf, str, n);
}
int main()
{
    const char* s = "AutumnZe";
    char buf[8] = {0};
    //strcpy(buf, s);
    strcpy(buf, s, sizeof(buf)-1);
    printf("%s\n", buf);
    return 0;
}

输出结果如下:

四、小结

  • 类的成员函数之间可以进行重载
  • 重载必须发生在同一个作用域中
  • 全局函数和成员函数不能构成重载关系
  • 重载的意义在于扩展已经存在的功能

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

(0)

相关推荐

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

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

  • 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++中函数重载详解

    目录 函数重载的概念 函数重载的应用 为什么C++支持函数重载,而C语言不支持 函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题. 函数重载的应用 1.比如以下代码,函数名一样,而参数的类型不同,在调用的时候编译器会根据传递的参数自动进行匹配. 2.在例如以下代码,我们进行编译,都可以编译成功. 3.接下来看一个有趣的现象,将上述第二个例子

  • C++函数重载介绍与原理详解

    目录 函数重载 函数重载的概念 函数重载的原理(名字修饰) 总结: extern “C” 函数重载 函数重载的概念 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同.函数重载常用来处理实现功能类似,而数据类型不同的问题. #include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, doub

  • C++ 函数重载详情介绍

    文章转自微信公众号:Coder梁(ID:Coder_LT) 函数重载 函数重载还有一个别名叫函数多态,其实我个人感觉函数多态这个名字更好理解更恰当一些. 函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数.当然这些同名函数的参数是要有区别的,我们在函数调用的时候,编译器会自动根据我们传入的参数,从多个同名函数当中找到我们调用的那一个.和面向对象里的多态的概念很接近. 我们在定义函数的时候,编译器只会查看参数的数目和类型,而不会理会参数的名称.只要参数的数量以及类型不完全相同,就

  • C++入门语法之函数重载详解

    目录 写在前面 1 函数重载的概念 2 函数重载原理 总结 写在前面 关于C语言的编译与链接不懂的可以看一下下面的文章,先回顾一下以前的知识. 详解C语言的编译与链接 1 函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题. //1.函数的参数个数不同 #include <iostream> using namespace std; void

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

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

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

  • C++ 中函数重载、覆盖与隐藏详解

    C++ 中函数重载.覆盖与隐藏详解 在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计:不管是面向对象编程,还是基于泛型编程,函数都可以随处而见.在谈论C++中的函数重载.覆盖和隐藏之前,先回顾下函数的基础知识. 函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型.参数的个数.参数的顺序).例如,声明一个两个整数之和的函数,int iAdd(int iNum1,int iNum2);而函数的定义可以理解为对函数功能的详尽而准确的解说,通俗点,就是实现函数"ho

  • 让 JavaScript 轻松支持函数重载 (Part 2 - 实现)

    识别文本签名 我们先来回顾一下上一篇文章中提到的Overload用例: 复制代码 代码如下: var extend = Overload .add("*, ...", function(target) { }) .add("Boolean, *, ...", function(deep, target) { }); 我们允许用户输入一个字符串,表示某一个重载的签名.在用户调用函数时,我们需要拿着用户输入的参数实例去跟签名上的每一个参数类型作比较,因此我们需要先把这个

  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    一.C++关键字 C++总共有63个关键字,在入门阶段我们只是大致了解一下就可,在后续博客中会逐渐讲解 二.命名空间 相信学过C++的同学,一定都写过下面这个简单的程序 #include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } 我们先来看第二行代码,using namespace std , 这行代码是什么意思呢 ? 这里我们

  • 通过实例理解javascript中没有函数重载的概念

    将函数名想象为指针,也有助于理解为什么ECMAScript中没有函数重载的概念.如下例子: 复制代码 代码如下: function addSomeNum(num) {     return num+100; } function addSomeNum(num) {     return num+200; } var result=addSomeNum(100);//300 显然,这个例子中声明了两个同名函数,而结果则是后面的函数覆盖了前面的函数.以上代码实际上与下面的代码是一致的. 复制代码 代

  • C++中const用于函数重载的示例代码

    常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2)const关键字可以用于对重载函数的区分. (3)常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数. (4)非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数. 重载看例子: #include<iostream> u

  • 详解JS函数重载

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,所有的实参都是保存在了这个数据结构里面,我们定义函数的时候所指定的形式参数其实是为这个数据结构里面的数据定义一个快捷的访问方式.也就是说js所有的函数都是支持无限个参数的,加上数据类型是弱类型,那么JS的函数除了名称就真的没有方法区别了? 办法总是有的,我们可以利用JavaScript中

  • JS函数重载的解决方案

    在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数.类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作. 在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这 么多个形参.还有一个特别之处就是跟Array类型相比,arguments变量有且只有一个length属性,Array的方法,例如push.pop 等,它并不具备,它只是一个"伪数组":具有length属性,存

随机推荐