C++学习笔记22,普通函数重载(1)
转载请注明出处: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)的更多相关文章
- c++学习笔记4(函数重载)
一个或多个函数,名字相似,然而参数个数或类型不同,这个叫做函数重载 优点:可以使函数的命名变得简单
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Python学习笔记之常用函数及说明
Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- SQL反模式学习笔记22 伪键洁癖,整理数据
目标:整理数据,使不连续的主键Id数据记录变的连续. 反模式:填充断档的数据空缺. 1.不按照顺序分配编号 在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键 ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
随机推荐
- fcc html5 css 练习1
font-size: 字号 利用link导入新字体再引用<link href="https://fonts.gdgdocs.org/css?family=Lobster" ...
- Python3之format
print('{0},{1}'.format('zhangk', 32)) print('{},{},{}'.format('zhangk','boy',32)) print('{name},{sex ...
- html5——伸缩比例案例(携程)
1.有图片的盒子,最好是父盒子设置伸缩属性,a标签设置伸缩比例1,img标签宽度100% 2.不要见到父盒子就设置伸缩属性,而是根据子盒子是否占据一行,若是子盒子占据一行,那么只要给子盒子设置伸缩比例 ...
- Tomcat服务器安装与第一个jsp网页程序
1.安装tomcat服务器之前需要,先安装相应版本的jdk,个人理解Tomcat的大部分功能是使用了java的 jdk jar包的. jdk包下载方式网上可以查到 下载完后可以解压到一个指定目录,并在 ...
- kickstart配置文件详解和system-config-kickstart (转载)
kickstart是什么 许多系统管理员宁愿使用自动化的安装方法来安装红帽企业 Linux.为了满足这种需要,红帽创建了kickstart安装方法.使用kickstart,系统管理员可以 ...
- java实例1
1.满天星星 import java.awt.*; public class xinxin { public static void main(String[] args) { Frame w = n ...
- IOS: Xcode报 Undecleared selector Warning错误的解决方法
Undecleared selector Warning 是编译器报的,特别是升级到IOS7 默认PROJ设定的时候,会出现这种问题,如果从代码上看语法完全没有问题,那么就可以在Xcode里面设置禁 ...
- CI框架3.x 之实现前后端分离
一.建立合理的目录结构 admin与home为后台和前台的控制器和模板文件夹 二.定义前后台视图路径常量 在constants.php中添加如下代码: //定义前台视图路径常量 define('HOM ...
- 微信小程序video
1.video是原生组件原生组件的层级是最高的,想要覆盖在video上,只能用cover-view 和 cover-image 组件,这2个可以无限嵌套.适用场景:给视频加标题: 2.检测video播 ...
- Vue中this.$router.push参数获取(通过路由传参)【路由跳转的方法】
传递参数的方法: 1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效.需要用nam ...