转载请注明出处:http://blog.csdn.net/qq844352155/article/details/31353325

该博文仅用于交流学习,请慎用于不论什么商业用途,本博主保留对该博文的一切权利。

博主博客:http://blog.csdn.net/qq844352155

什么是方法重载?

方法重载也能够说是函数重载,函数的多态性。

详细来说就是将函数或者方法的名称用于多个函数。可是參数的类型或者參数的数目不同。

在这篇blog里面我仅仅讨论类外函数的重载。

比如一个简单的样例:

#include <iostream>
#include <string>
using namespace std; void printf(int i){
cout<<"This is an int:"<<i<<endl;
}
void printf(const string s){
cout<<"This is a string:"<<s<<endl;
}
int main(){
int a=10;
string s="my name is jack!";
printf(a);
printf(s);
system("pause");
}

该cpp里面有两个同名的printf函数,可是两者的參数类型不同。这就是一个最简单的函数重载的样例。

当传递的參数不一样时,将调用相应的函数。

可是须要注意的是。有时候编译器会进行自己主动转换。

#include <iostream>
#include <string>
using namespace std; void printf(const char i){
cout<<"This is an char:"<<i<<endl;
}
void printf(const string s){
cout<<"This is a string:"<<s<<endl;
}
int main(){
int a=11;
string s="my name is jack!";
printf(a);
printf(s);
printf(67);
system("pause");
}

执行结果:



能够看到,int自己主动转换为了char类型。

假设不希望自己主动转换,在C++11中支持删除指定重载函数的方法.

#include <iostream>
#include <string>
using namespace std; void printf(int i){
cout<<"This is an int:"<<i<<endl;
}
void printf(const string s){
cout<<"This is a string:"<<s<<endl;
}
void printf(char c)=delete;
int main(){
int a=10;
string s="my name is jack!";
char ch='a';
printf(a);
printf(s);
printf(ch); return 0;
}

这样就能够阻止自己主动转换了.

须要注意的是:一些看起来參数不一样的函数时不能共存的。

比如

void printf(const string s){
cout<<"This is a const string:"<<s<<endl;
}
void printf(string s){
cout<<"This is a string:"<<s<<endl;
}

以及:

void printf(string &s){
cout<<"This is a const string:"<<s<<endl;
}
void printf(string s){
cout<<"This is a string:"<<s<<endl;
}

从编译器的角度去看printf(s);编译器根本不知道你到底想要调用哪一个函数。

这些情况,编译器会觉得是错误。

可是对于重载引用參数。这个有点不一样。比如

</pre><pre name="code" class="cpp">#include <iostream>
#include <string>
using namespace std;
void printf(const string &s){
cout<<"This is a const string:"<<s<<endl;
}
void printf(string &s){
cout<<"This is a string:"<<s<<endl;
} int main(){
string s="my name is jack!";
printf(s);
const string cs="hello world!";
printf(cs);
system("pause");
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

编译器将自己主动调用最匹配的那一个函数。

这个就是普通的函数重载,在类外的情况。

事实上这个能够通过模板函数来取代,而且更加高效。

#include <iostream>
#include <string>
using namespace std;
template<class T>
void printf(T t){
cout<<"I don't know what it is!but I can show it -->"<<t<<endl;
} int main(){
int a=10;
string s="my name is jack!";
printf(a);
printf(s);
system("pause");
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

C++学习笔记22,普通函数重载(1)的更多相关文章

  1. c++学习笔记4(函数重载)

    一个或多个函数,名字相似,然而参数个数或类型不同,这个叫做函数重载 优点:可以使函数的命名变得简单

  2. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  4. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  5. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  6. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  7. SQL反模式学习笔记22 伪键洁癖,整理数据

    目标:整理数据,使不连续的主键Id数据记录变的连续. 反模式:填充断档的数据空缺. 1.不按照顺序分配编号 在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键 ...

  8. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  9. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  10. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

随机推荐

  1. Android_撕衣服小案例

    一直都觉得做安卓开发挺有意思,最近一段时间都在学习这方面的知识以及练习敲代码这次要说的是一个简单有趣的案例,相信大家也是看了标题才进来的吧,是不是有点迫不及待的想看看效果图,嘿嘿,算了还是直接给上源码 ...

  2. 【Caffe】Ubuntu16.04上配置安装caffe(Only CPU)

    一.首先看看自己的系统,Ubuntu16.04,cpu,没有Nvidia,没有opencv 二.安装依赖包 安装protobuf,leveldb,snappy,OpenCV,hdf5, protobu ...

  3. tailf

    功能说明:tailf命令几乎等同于tail -f,与tail -f不同的是,如果文件不增长,那么它不会去访问磁盘文件,也不会更改文件的访问时间.tailf命令在工作中的主要使命就是跟踪日志文件,首先将 ...

  4. HDU_5723_最小生成树+任意两点距离的期望

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. Linux下/var/log/btmp文件

    今天查看了一下服务器,发现/var/log/btmp日志文件比较大占用磁盘空间,搜索一下,此文件是记录错误登录的日志,就是说有很多人试图使用密码字典登录ssh服务,此日志需要使用lastb程序打开. ...

  6. 利用shell脚本去备份幸运28源码搭建下载所指定的数据库

    #! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...

  7. Day 13 进程和线程

    进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务 ...

  8. 00.模块1.模块(Module)和包(Package)

    转自廖雪峰老师官方网站 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件 ...

  9. (ccf)201709-4 通信网络

    #include<iostream> #include<memory.h> #include<stack> #include<string> #incl ...

  10. Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口)

    >Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口) >>实验开始,先上拓扑图参考: >>>实验目标:分别实现主 ...