展开全部
函数重载不能完全替代可变长参数……虽然函数重载可以让你在同一个代码里写出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的变长参数模板给了一种既无需写无数个函数定义又具有安全性的解决方法……
尽管如果函数的参数类型唯一且参数数目在一个很小的范围内,那么代价还是可以接受的(毕竟有安全性作为补偿),但仍然是一种麻烦的办法,C++11的变长参数模板给了一种既无需写无数个函数定义又具有安全性的解决方法……
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以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.要么只写三个参数的形式,然后给第三个参数一个默认值。
这三种方法都可以实现函数名相同,参数不同的函数。你可以在标准库里看到许多重载的函数,使用相同的函数名表示我在做同一件事,而接受参数不同,可以用于不同的情况。相比于使用变参而言,第二种和第三种技术会更简单,更方便。
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/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
也就是一种多态,比如你有了电脑就可以上网听音乐看电影玩游戏一应俱全,而不必去看电视,玩小霸王或者去影院,比喻可能不恰当不过基本这个意思。
本质是c++ oop的需要,因为c里函数名无法重复,而c++只规定函数特征标不能重复,也就是说c++里同一个函数名,比如compare,可以比较字符串与字符串,整数与整数,甚至字符串和整数的大小,而c里就不得不用3个不同名的函数实现比如string_compare,int_compare之类,这显然比较麻烦。另外变参在设计上并不完全安全因为没有类型信息,这也有悖oop设计理念。
本质是c++ oop的需要,因为c里函数名无法重复,而c++只规定函数特征标不能重复,也就是说c++里同一个函数名,比如compare,可以比较字符串与字符串,整数与整数,甚至字符串和整数的大小,而c里就不得不用3个不同名的函数实现比如string_compare,int_compare之类,这显然比较麻烦。另外变参在设计上并不完全安全因为没有类型信息,这也有悖oop设计理念。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。
2、重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
3、具体优点说来有三点:
(1)、试想如果没有函数重载机制,如在C中,必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。这样做很不友好!
(2)、类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
(3)、操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等!
2、重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
3、具体优点说来有三点:
(1)、试想如果没有函数重载机制,如在C中,必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。这样做很不友好!
(2)、类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
(3)、操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询