转载请注明出处: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. jQuery——自定义动画

    动画方法:animate(json,1000, function (){}) 参数说明:json代表属性设置,1000是动画时间,最后一个是回调函数,其中动画时间可选 属性支持:http://www. ...

  2. 六时出行 App iOS隐私政策

    本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...

  3. VC使用CryptoAPI计算MD5

    // md5.h #include <tchar.h> #include <wincrypt.h> // 计算Hash,成功返回0,失败返回GetLastError() // ...

  4. (二)Python 学习第二天--爬5068动漫图库小案例

    (注:代码和网站仅仅是学习用途,非营利行为,源代码参考网上大神代码,仅仅用来学习

  5. iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)

    这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一 ...

  6. C#斐波那契数列方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. Redis 之持久化(rdb、aof)

    Redis的持久化有2种方式   1快照  2是日志 测试aof:

  8. CAD直接打印,不出现打印对话框(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_Print 直接打印,不出现打印对话框,详细说明如下: 参数 说明 double ptLBx 打印的范围左下角x double ...

  9. 【剑指Offer】65、矩阵中的路径

      题目描述:   请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...

  10. python 单元测试中处理用例失败的情况

    今天有一个需求, 在单元测试失败的时候打印一些日志, 我们管他叫 dosomething 吧 ,反正就是做一些操作 查了下并没有查到相关的方法, 于是研究了一波unittest 的源码 发现了这个东西 ...