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的更多相关文章

  1. c++之五谷杂粮---1

    1.  位运算符,如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器.此时左移操作可能会改变符号位的值,因此是一种UB. Best Practices: 关于符号位 ...

  2. c++之五谷杂粮---2

    2.1  我们通过调用运算符(call operator)来执行函数.调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者指向函数的指针:圆括号之内是用逗号隔开的实参列表,我们用实参初 ...

  3. c++之五谷杂粮4---explicit

    4.1在要求隐式转换的程序上下文中,我们可以通过将构造函数声明为explicit加以阻止. 关键字explicit只对一个实参的构造函数有效.需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些 ...

  4. make——五谷杂粮

  5. 【转】2013年中国IT业10大公司

    转自:http://www.chinaz.com/news/2013/1217/331446.shtml?zyy 1.最得志的公司:小米 在2013年,再没有一家公司像小米这样志得意满,即便看看所有的 ...

  6. 关于Java中的对象、类、抽象类、接口、继承之间的联系

    关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...

  7. 一年一度!GitHub 开发者大会「GitHub 热点速递 v.22.45」

    GitHub 是全球最大的开源社区,它的一举一动都深受每一位开源爱好者的关注.这周末刚落下帷幕的<GitHub Universe 2022>是 GitHub 发布最新产品.功能.报告和计划 ...

  8. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  9. 《OOC》笔记(0)——为何要看这本书

    <OOC>笔记(0)——为何要看这本书 <OOC>全名是<Object-oriented Programming with ANSI-C>,作者Axel-Tobia ...

随机推荐

  1. oracle 11g完美卸载

      oracle 11g完美卸载 CreateTime--2018年4月22日17:07:19 Author:Marydon 对于oracle数据库的卸载,一定要卸载干净,否则,再次想装oracle时 ...

  2. redis编译

    简介: Redis是Nosql中比较出名的,分布式数据库缓存,提升相应的速度,降低对数据库的访问! Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,(永久 ...

  3. 更改npm全局模块和cache默认安装位置

    来源于:http://blog.csdn.net/friendan/article/details/51736231 1.因为我安装的Node.js自带了npm,所以在nodejs文件夹里面新建以下两 ...

  4. HashTable、List、ArrayList的经典使用和相互转换

    1.添加引用 using System.Collections; 2.创建并添加数据 Hashtable hs = new Hashtable(); hs.Add("Name1", ...

  5. 如何解决普通用户使用sudo找不到命令

    一.在linux的普通用户下,要使用root权限的命令需要使用sudo [dev@dev1 client_api]# sudo git pull origin develop sudo: git: c ...

  6. HDUOJ----2647Reward

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. eclipse 无代码自动提示

    http://blog.csdn.net/wgw335363240/article/details/6235427eclipse 无代码提示,显示No Default Proposals,Conten ...

  8. C# 自定义文件格式并即时刷新注册表 非关闭explorer

    转自:http://blog.csdn.net/zhangtirui/article/details/4309492 最近公司在做一个项目  用到关于自定义格式的文件,但在注册表图标更改后  文件图标 ...

  9. 最简易的PHP Storm调试模式开启方式

    使用的是xdebug调试工具. 其实真的很想吐槽php语言开启调试模式真的好麻烦. 据说xdebug调试工具不支持php7.0以下版本,我同事的php5.6就不支持噗嗤.. 正文: 1.先用phpSt ...

  10. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...