C++中函数重载有啥用?

记得一本书上说过,C++中的函数重载能替代C中的变参技术,为什么?

    类的构造函数跟类名相同,即构造函数都同名。如果没有函数重载机制,要想实例化不同的对象非常麻烦。

    操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,例如“+”可用于连接字符串等。

重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-25
函数重载不能完全替代可变长参数……虽然函数重载可以让你在同一个代码里写出print(1,2,'a');和print("a=",12);而不需要写printf("%d%d%c",1,2,'a')和printf("%s%d","a=",12);,但代价是你需要写无数个print函数的定义……例如这个例子里你就要同时写int print(const int,const int,const char)函数的定义和int print(const char*,const int)函数的定义。
尽管如果函数的参数类型唯一且参数数目在一个很小的范围内,那么代价还是可以接受的(毕竟有安全性作为补偿),但仍然是一种麻烦的办法,C++11的变长参数模板给了一种既无需写无数个函数定义又具有安全性的解决方法……本回答被提问者和网友采纳
第2个回答  2013-02-06
以algorithm里的sort函数为例,
default (1)template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

custom (2)template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

这是http://www.cplusplus.com/reference/algorithm/sort/上的内容,sort有两种形式,第一种接受两个迭代器,然后对序列排序,第二种,接受两个迭代器和一个自定义的比较函数来告诉sort该怎么样进行排序。

你可以看到,两种形式的差别在与第二种形式多了一个参数,为了实现这种函数,
1.要么使用变参函数,写一个sort(iter,iter, ...)来将第三个参数作为变参
2.要么使用函数重载函数,写两个参数不同的sort函数
3.要么只写三个参数的形式,然后给第三个参数一个默认值。

这三种方法都可以实现函数名相同,参数不同的函数。你可以在标准库里看到许多重载的函数,使用相同的函数名表示我在做同一件事,而接受参数不同,可以用于不同的情况。相比于使用变参而言,第二种和第三种技术会更简单,更方便。

参考资料:http://www.cplusplus.com/reference/algorithm/sort/

第3个回答  2013-02-06
也就是一种多态,比如你有了电脑就可以上网听音乐看电影玩游戏一应俱全,而不必去看电视,玩小霸王或者去影院,比喻可能不恰当不过基本这个意思。
本质是c++ oop的需要,因为c里函数名无法重复,而c++只规定函数特征标不能重复,也就是说c++里同一个函数名,比如compare,可以比较字符串与字符串,整数与整数,甚至字符串和整数的大小,而c里就不得不用3个不同名的函数实现比如string_compare,int_compare之类,这显然比较麻烦。另外变参在设计上并不完全安全因为没有类型信息,这也有悖oop设计理念。
第4个回答  推荐于2016-08-26
1、函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。
2、重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
3、具体优点说来有三点:
(1)、试想如果没有函数重载机制,如在C中,必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。这样做很不友好!
(2)、类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
(3)、操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等!
相似回答