c++中的函数重载

c++中的函数重载

  • 什么是函数重载

    重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,这组函数被称为重载函数。

  • 函数重载的作用

    重载函数常用来实现功能类似而所处理的数据类型不同的问题,能减少函数名的数量,提高程序的可读性。

  • 重载函数的构成说明

    定义一个类,添加一系列函数名相同的函数,但参数形式各有不同,测试一下能否构成重载。

#include <iostream>
using namespace std;

class Base
{
    public:
        void func(int a){cout << "this is "<< a <<endl;}
        void func(string a){cout << "this is " << a <<endl;}
        void func(int a,int b){cout << "this is "<< a <<endl;}
        void func(int a,string b){cout << "this is "<< a <<endl;}

        //错误的重载1
        int  func(int a,int b){cout << "this is "<< a <<endl;}
        //错误的重载2
        void  func(const int a,int b){cout << "this is "<< a <<endl;}
        //错误的重载3
        void func(int b,int a){cout << "this is "<< a <<endl;}
};

int main()
{
    Base b;
    b.func(22);
    b.func("test");

    return 0;
}

??以上程序执行编译会报错:

‘void Base::func(int)’ cannot be overloaded ...

??即函数不能构成重载,原因分别为:

  • 返回值不同,不能构成函数重载。

    对应错误1:想想也是,执行函数调用时,只知道传入的参数,是无法预知要返回什么类型的值的,所以自然不知道该调用哪一个函数。

  • 形参是const修饰的常值不能构成函数重载。

    对应错误2:说明编译时二者对应的符号是一致的。注意,如果形参是引用或指针是可以构成重载的。即下面的情况:

class Base
{
    public:
        void func(int &a){cout << "this is "<< a <<endl;}
        void func(const int &a){cout << "this is "<< a <<endl;}
}
  • 参数类型相同,只是命名不同,不能构成重载。
class Base
{
    public:
        void func(int a){cout << "this is "<< a <<endl;}
        void func(int b){cout << "this is "<< b <<endl;}
}
  • 备注

    函数重载是c++比较重要的概念,涉及比较偏门的使用场景,比如参数有const修饰,就会引来比较蛋疼的疑惑,这里整理的还不够充分,后期将逐步进行整理和完善。

版权声明:本文为csdn博主[applebite](http://blog.csdn.net/applebite) 原创文章,转载请注明出处,侵权必究。

时间: 2024-12-09 21:24:57

c++中的函数重载的相关文章

关于在C#中对函数重载理解

函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是不同的.当我们调用这些函数时,怎么判断我们调用的是那一个函数呢,这个就要看你在使用重载函数时所传参数的类型或者参数个数.好了,话不说.看看代码就知道了. using System;namespace overload{    class a    {        public void print

js中没有函数重载,怎样实现函数重载的功能?

js中没有函数重载,javasript中使用可选参数:arguments实现相同的功能.. 函数在定义的时候可不定义参数: <script type="text/javascript" > function say() { for (var i = 0; i < arguments.length; i++) { alert(arguments[i].toString()); } } </script> 调用:<input type="but

C++中的函数重载与模板

函数就像工具,工具有好多种,我们就以螺丝刀为例来感受一下它和函数重载和模板的一些相似关系. 螺丝刀的种类有很多,常见的是一字型和梅花型, 每种类型从小到大又有好多个号. 我们根据螺丝样式和大小 选择使用那种类型的和选择多大号的螺丝刀. 螺丝刀就干了一件事,拧螺丝,也就是说各种螺丝刀他们的功能是相 同的,只是类型不同而已. 一.函数重载 在C++中,允许用一个函数名来表达功能相同,只是操作类型(形参个数和类型)不同的函数,这就是函数重载. 编译器能够根据他们各自的实参和形参以及参数的个数进行最佳分

对比C++与Java中的函数重载、覆盖、和隐藏

                                  在C++中 1.函数的重载 C++中的函数的重载要求的是  函数名相同 参数列表必须不同  返回值类型可以相同也可以不相同:只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数.例如:void display():void display(int  i);void dispaly(double  i);void  display(int i,double i); void display(double  i,i

C/C++中的函数重载(overloading)

几年前,我已经介绍过如何使用const和volatile限定词声明数据.使用这些限定词来声明数据,产生的影响会波及到函数的声明.在C和C++中,影响是不一样的,很大程度上是因为C++中的函数声明比C有更多的功能.为了更清楚描述清楚影响的不同,我们先来看看C和C++中函数最主要的差异是什么. 很多C库包含至少一组的命名非常接近的函数.每个函数除了参数或返回值不同,功能在本质上是相同的. 标准C库也包含若干这样的组.例如,有一组“abs”函数专门用来计算一个数值的绝对值.组里包含: int abs(

第29课 类中的函数重载

函数重载回顾: 类中的重载: 万变不离其宗: 类中的普通成员函数和静态成员函数也够成重载. 示例程序: 1 #include <stdio.h> 2 3 class Test 4 { 5 int i; 6 public: 7 Test() 8 { 9 printf("Test::Test()\n"); 10 this->i = 0; 11 } 12 13 Test(int i) 14 { 15 printf("Test::Test(int i)\n"

类中的函数重载

函数重载回顾: - 函数重载的本质为相互独立的不同函数; -C++通过函数名和函数参数确定函数调用. -无法直接通过函数名得到重载函数的入口地址. -函数重载必然发生在同一作用域. 类中的重载: -构造函数的重载; -普通成员函数的重载 -静态成员函数的重载 Question: 全局函数,普通成员函数以及静态成员函数之间是否可以构成重载. 万变不离其宗: 1.重载函数的本质为多个不同的函数. 2,函数名和参数列表是唯一的标识符; 3.函数重载必然发生在同一作用域. 深度的意义: -通过函数名对函

从两个角度理解为什么 JS 中没有函数重载

函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处. 但是在 JS 如果不通过一些方法是无法实现重载的,可以从以下两个角度去理解. 1. 方法签名 方法签名指的是函数的名称加形参列表,并且通过函数的名称或者形参列表都可以区分出是不同的函数. JS 中通过形参是没有办法区分出不同的函数的,只能通过函数的名称区分出

PHP中实现函数重载

由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸如整型,字符串之类的标量类型上),并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入4个或者更多的参数.因此基于这2点,注定了PHP中无法重载函数,(类似Javascript语言),也无法有构造函数的重载. 由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了.事实上,PHP的提供了一个魔术方法,mixed __call ( string name,