c++整理--函数重载

一、为什么C语言不支持函数重载而c++能支持

什么是函数重载?为什么C语言不支持函数重载,而c++能支持函数重载?

解析:

  函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。在C语言里需要写两个不同名称的函数来进行区分。

    #include <iostream>  using namespace std;  class Test  {  public:  int add(int x, int y)           //相加,传入参数以及返回值都是int  {  return x+y;  }  float add(float x, float y)     //相加,传入参数以及返回值都是float  {  return x+y;  }  };  int add(int x, int y)               //相加,传入参数以及返回值都是int  {  return x+y;  }  float add(float x, float y)         //相加,传入参数以及返回值都是float  {  return x+y;  }  int main()  {  int i = add(1, 2);  float f = add(1.1f, 2.2f);  Test test;  int i1 = test.add(3, 4);  float f1 = test.add(3.3f, 4.4f);  cout<<"i = "<<i<<endl;  cout<<"f = "<<f<<endl;  cout<<"i1 = "<<i1<<endl;  cout<<"f1 = "<<f1<<endl;  return 0;  }  
上面的程序中使用了全局函数和类成员函数的重载,代码30~39行是对它们的调用与测试。可以看到,在c++中可以根据传入参数类型和返回类型来区分不同的重载函数。

  C语言不支持函数重载,c++却支持,为什么呢?这是因为c++的重载函数经过编译器处理之后,两个函数的符号是不相同的。例如代码第18行的add函数,经过处理后变成了_int_add_int_int之类,而后者变成了_float_add_float_float之类。这样的名字包含了函数名、函数参数数量及返回类型信息,c++就是靠这种机制来实现函数重载的。

总结:

  函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。

  函数名经过c++编译器处理后包含了原函数名、函数参数数量及返回类型信息,而C语言不会对函数进行处理。

    (A) int calc(int, int);  int cale(const int, const int);  (B) int get();  double get();  (C) int *reset(int*);  double *reset(double*);  (D) extern "C" int compute(int *, int);  extern "C" double compute(double*, double);  

A错误。第二个函数被视为重复声明,第二个声明中的const修饰词会被忽略。

B错误。第二个声明是错误的,因为单就函数的返回值而言,不足以区分两个函数的重载。

C正确。这是合法的声明,reset()函数被重载。

D错误。第二个函数声明是错误的,因为在一组重载函数中,只能有一个函数被指定为extern "C"


三、重载和覆写有什么区别

  重载是指子类改写了父类的方法,覆写是指同一个函数的不同版本之间参数不同。

  重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它具有如下特征:

(1)方法名必须相同。

(2)参数列表必须不相同,与参数列表的顺序无关。

(3)返回值类型可以不相同。

  覆写是派生类重写基类的虚函数,它具有如下如示的特征。

(1)只有虚函数的抽象方法才能被覆写。

(2)相同的函数名

(3)相同的参数列表

(4)相同的返回值类型

  重载是一种语法规则,有编译器在编译阶段完成,不属于面向对象编程;而覆写是由运行阶段决定的,是面向对象编程的重要特征。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 灾难恢复 Linux 系统启动故障修复

#http://hi.baidu.com/winshining/item/3d964328e252b6cfdcf69aaa #http://www.verydemo.com/demo_c281_i514.html 简介&#xff1a; Linux 发行版本众多&#xff0c;现如今也得到了越来越广泛的应用&#xff0c;同时也面临着系统出现故障的潜在风险&#xff0c;本文将详细介绍…

EPOLLOUT/EPOLLIN事件触发的条件

1、EPOLLOUT事件触发的条件&#xff1f; (1)、一次write操作&#xff0c;写满了发送缓冲区&#xff0c;返回错误码为EAGAIN(11)。 (2)、对端读取了一些数据&#xff0c;又重新可写了&#xff0c;此时会触发EPOLLOUT。 简单地说&#xff1a;内核缓冲区由不可写变为可写时会触发…

08.Numpy数组迭代

一般迭代 NumPy包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象&#xff0c;可以用于在数组上进行迭代。 数组的每个元素可使用 Python的标准Iterator接口来访问。 使用arange()函数创建一个 3X4 数组&#xff0c;并使用nditer对它进行迭代。 示例 1 >>…

专家答疑:在ERP系统中确保销售订单准确性

若销售订单有错&#xff0c;如订单数量或者订单价格有问题的话&#xff0c;则会造成一系列的连锁反应。计划模块、采购模块、生产模块、库存模块等等都会受到牵连。而且最要命的是&#xff0c;很哪进行调整。所以&#xff0c;在ERP系统使用过程中&#xff0c;应该千方百计保障销…

hdfs为什么要用block以及block大小的设置

1、在HDFS里面&#xff0c;文件存储为什么要以Block块的方式存储&#xff1f; 目的&#xff1a;减少磁盘寻道的时间。 (1)、不设置block&#xff1a;因为数据是分散的存放磁盘上的&#xff0c;读取数据时需要不停的进行磁盘寻道&#xff0c;开销比较大。 (2)、使用block: 一次…

c++整理--虚函数

一、虚函数是这么实现的 解析&#xff1a;简单的说&#xff0c;虚函数是通过虚函数表实现的&#xff0c;那么什么是虚函数表呢&#xff1f;事实上&#xff0c;如果一个类中含有虚函数表&#xff0c;则系统会为这个类分配一个指针成员指向一张虚函数表&#xff08;vtbl&#xff…

[Linux] 命令行工具

1. 基本工具1.1 特殊字符shell的特殊字符有&#xff1a;&、;、|、*、?、、"、、[、]、(、)、$、<、>、{、}、^、#、/、\、%、!、~、。要将这些具有特殊含义的字符当作普通字符使用&#xff0c;可对它们转义使用&#xff0c;在特殊字符前加反斜杠" \ "…

【技术博客-总览--重要】

1 mayday05/technology-talk forked from aalansehaiyang/technology-talk https://github.com/mayday05/technology-talk/blob/master/middle-software/kafka.md 转载于:https://www.cnblogs.com/snowwhite/p/10504391.html

Python 代码调试技巧

Python 代码调试技巧 2012-5-3 简介&#xff1a; Debug 对于任何开发人员都是一项非常重要的技能&#xff0c;它能够帮助我们准确的定位错误&#xff0c;发现程序中的 bug。python 提供了一系列 debug 的工具和包&#xff0c;可供我们选择。本文将主要阐述如何利用 python debu…

谈谈JAVA中的安全发布

谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级"&#xff0c;看完之后很有共鸣。再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸&#xff0c;又掏出了《Java并发编程实战》研读一番&#xff0c;这本书应该是属于为“JAVA 多线程作注解”的一…

微机原理8086CPU

8086CPU有14个寄存器&#xff1a;AX BX CX DX SI DI SP BP IP CS SS DS ES PSW寄存器16位&#xff0c;存放2个字节ABCDX为通用寄存器2^16-1最大数据存放8086上一代CPU中的寄存器都是8位 四个寄存器可以分为两个独立的8位寄存器使用分为AH、AL 高八位低八位数据最大存放16位822…

软件工程 - 设计模式学习之工厂方法模式Factory Method

在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖.我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的.这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UML图: 这个模式中我们可以看到:产品和工厂2个基类,然后它们下面又有些子孙类…

一个简单的Makefile模板

FLAGS -Wall -g INCLUDE-I$(ACE_ROOT)/include ACE_LIB-L$(ACE_ROOT)/libN_LIB-lACEDD-DACE_HAS_EVENT_POLL Server:Server.o TaskWork.o  g -o Server Server.o TaskWork.o $(ACE_LIB) $(N_LIB) $(DD)Server.o:Server.cpp ClassDefined.h  g $(FLAGS) $(INCLUDE) $(DD) -…

new 与 malloc区别

new和malloc的区别 属性 new/delete是C关键字&#xff0c;需要编译器支持。malloc/free是库函数&#xff0c;需要头文件支持c。 参数 使用new操作符申请内存分配时无须指定内存块的大小&#xff0c;编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。 …

树莓派3B+学习笔记:4、查看GPIO

GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口。可以在终端重直接查看GPIO的定义。查看方式1&#xff1a;gpio readall 查看方式2&#xff1a; pinout 可以看出&#xff0c;这条命令执行后提示要查看更多信息访问pinout.xyz 转载于:https://w…

汇编语言基础知识点

汇编指令和机器指令一一对应&#xff0c;有编译器翻译识别&#xff0c;计算机无法直接识别一个存储单元等于1字节 1字节等于8位1KB1024Byte(字节)1Byte8bit&#xff08;位&#xff09;CPU中&#xff0c;指令和数据都是二进制形式存在磁盘的数据&#xff0c;CPU无法直接使用&…

java开发环境搭建--写给java新手

最近我遇到很多java开发的新人&#xff0c;包括很自认为不是新人的人根本就不会自己搭建一个完整的开发环境&#xff0c;因此想写此文&#xff0c;希对他们有所帮助&#xff0c;解除他们的一些开发困惑&#xff0c;更好的了解java. 一、windows下开发环境的搭建 1、从http://ja…

Silverlight的自定义tooltip提示工具条

这种应用场景其实很多&#xff0c;比如游戏中装备/魔法的选择菜单&#xff0c;这里借用了"深蓝色右手"的一张图 再比如聊天室中的文本颜色设置 虽然sl的ToolTipService.ToolTip属性可以设置任何对象&#xff0c;比如下面这样 代码 1 <Rectangle Fill"Red&qu…

c++ 线程间通信方式

一&#xff1a;两个进程间的两个线程通信&#xff0c;相当于进程间通信 二&#xff1a;一个进程中的两个线程间通信 通信方式&#xff1a; 1.互斥锁 mutex; lock_guard (在构造函数里加锁&#xff0c;在析构函数里解锁&#xff09; unique_lock 自动加锁、解锁 2.读写锁 shar…

Linux dmidecode备忘

dmidecode之前笔者在文章Linux下查看主板的相关信息中已经介绍了该命令查看主板信息的用法&#xff0c;这里进一步介绍 DMI&#xff0c;即DesktopManagement Interface。也有被称为SMBIOS&#xff0c;即System Management BIOS。DMI表的意义在于让我们在不探测硬件实体的情况下…