c++之五谷杂粮---3
3.1如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。
3.1.1不允许两个函数除了返回类型外所有的要素都相同。(这也是很好解释的)
#include<iostream>
using namespace std;
int fuc(int a, double b)
{
cout<<"a= "<<a<<" "<<"b= "<<b<<endl;
return ;
}
void fuc(int a, double b)
{
cout<<"a= "<<a<<" "<<"b= "<<b<<endl;
}
int main(void)
{
//如果允许只有返回类型不同,那么下面这个该调用谁呢?
fuc(,3.14);//因为我们完全可以不关心返回值,所以这样的调用是很常见也是合法的,但是想要重载调用,就是非法的,因为编译器不知道该调用哪一个,二义性。
return ;
}
3.1.2 有默认参数的重载测试
#include<iostream>
using namespace std;
int fuc(int a, double b=3.14)
{
cout<<"a= "<<a<<" "<<"b= "<<b<<endl;
return ;
}
int fuc(int a)
{
cout<<"a= "<<a<<endl;
return ;
}
int main(void)
{
fuc();//错误,此时编译器不知道到底调用谁,所以有默认实参的重载一定要小心,尤其在后面的类当中。
return ;
}
3.1.3 忽略了顶层const的重载
eg1:
#include<iostream>
using namespace std;
int fuc(int a)
{
cout << "a= " << a << endl;
return ;
}
int fuc(const int a)
{
cout << "a= " << a << endl;
return ;
}
int main(void)
{
fuc();//错误,依旧不能重载,顶层const会被忽略,具体见前面随笔的讲解
return ;
} eg2:
void test(const int *a)
{ }
void test(int *a)
{ }
int main(void)
{
int *a=nullptr;
test(a);//底层const可以重载,如果这里改成顶层const,依旧不能重载
return ;
}
NOTE:
1、局部变量不能做默认实参。
2、重载函数的指针,指针类型必须与重载函数中的某一个的类型完全匹配,不能只匹配参数或者只匹配返回值的类型,必须完全匹配。
c++编译器可以处理重载函数名字一样的问题,如下面的fuc函数,fuc函数传递给函数指针的不会有错,根据你的函数指针指向的类型,你能调用对应的函数,注意要完全匹配。
如果下面的fuc函数 unsigend int参数的这个函数,如果函数指针调用的时候给了一个double参数,会有警告,因为double可以转换成unsigend int,这个和普通函数调用的转变一致。
int main(void)
{
void fuc(int *);
void fuc(unsigned int); void(*pf1)(int)=fuc;//错误,没有任何一个与fuc的形参列表匹配
double(*pf2)(int *)=fuc;//错误,返回类型不匹配 return ;
}
c++之五谷杂粮---3的更多相关文章
- c++之五谷杂粮---1
1. 位运算符,如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器.此时左移操作可能会改变符号位的值,因此是一种UB. Best Practices: 关于符号位 ...
- c++之五谷杂粮---2
2.1 我们通过调用运算符(call operator)来执行函数.调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者指向函数的指针:圆括号之内是用逗号隔开的实参列表,我们用实参初 ...
- c++之五谷杂粮4---explicit
4.1在要求隐式转换的程序上下文中,我们可以通过将构造函数声明为explicit加以阻止. 关键字explicit只对一个实参的构造函数有效.需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些 ...
- make——五谷杂粮
- 【转】2013年中国IT业10大公司
转自:http://www.chinaz.com/news/2013/1217/331446.shtml?zyy 1.最得志的公司:小米 在2013年,再没有一家公司像小米这样志得意满,即便看看所有的 ...
- 关于Java中的对象、类、抽象类、接口、继承之间的联系
关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...
- 一年一度!GitHub 开发者大会「GitHub 热点速递 v.22.45」
GitHub 是全球最大的开源社区,它的一举一动都深受每一位开源爱好者的关注.这周末刚落下帷幕的<GitHub Universe 2022>是 GitHub 发布最新产品.功能.报告和计划 ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- 《OOC》笔记(0)——为何要看这本书
<OOC>笔记(0)——为何要看这本书 <OOC>全名是<Object-oriented Programming with ANSI-C>,作者Axel-Tobia ...
随机推荐
- 【Oracle】查询字段的长度、类型、精度、注释等信息
查询数据字典中字段的相关信息 SELECT T .column_name AS column_name, --列名 T .column_type AS column_type, ---字段类型 T . ...
- 类的专有方法(__getitem__和__setitem__)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.imooc.com/code/6252 #类的专有方法(__getitem__和__s ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- jQuery 源码学习笔记
//检测 window 中新增的对象 //first var oldMap = {}; for(var i in window) { oldMap[i] = 1; } //second for(var ...
- WordPress 主题教程:从零开始制作 WordPress 主题
为什么要开发WordPress主题? WordPress主题由一系列文件和样式表单组成,这些文件和样式表单共同作用生成WordPress网站的外观.每个主题都不同,用户可以通过这些主题随心所欲地更换自 ...
- Drupal的$messages是怎么显示的?
Drupal的默认主题bartik会在页面顶部显示系统信息,例如警告.状态等.这个过程是如何实现的? 首先,在bartik目录下找到page.tpl.php,这是bartik主题的页面显示模板.其中有 ...
- 微信小程序条码、二维码生成模块
代码地址如下:http://www.demodashi.com/demo/13994.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 【转载】spring mvc 使用session
http://home.51.com/gaoyangboy/diary/item/10036382.html Spring2.5 访问 Session 属性的四种策略 Posted on 2008-1 ...
- 给你的博客加上“Fork me on Github”彩带(转)
给你的博客加上“Fork me on Github”彩带 https://www.cnblogs.com/Leo_wl/p/3608794.html https://github.blog/2008- ...
- 使用mysql遇到的异常
Can't find any matching row in the user table 原因 更改mysql.user表之后,没有使用flush privileges命令来更新权限. 解决方案 使 ...