C++对c中函数的拓展,函数重载
函数参数的拓展
inline内联函数
最好 小的函数都写成内联函数, 写上inline 编译器不一定内联,
C++中推荐使用内联函数替代宏代码片段
C++中使用inline关键字声明内联函数
内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。
宏替换和函数调用区别
结论:
)内联函数在编译时直接将函数体插入函数调用的地方
)inline只是一种请求,编译器不一定允许这种请求
)内联函数省去了普通函数调用时压栈,跳转和返回的开销
最好 小的函数都写成内联函数, 写上inline 编译器不一定内联,
默认参数
函数默认参数的规则
只有参数列表后面部分的参数才可以提供默认参数值
一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
传参时:print(,); 后面的不写就是默认的,写的话就按照写的
在类的构造函数中常用来这样写
void print(int a, int b, int x = , int y=, int z = )
{
printf("x:%d\n", x);
}
函数重载
什么是函数重载
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
函数重载发生在同一个类中
函数重载的好处
函数重载的条件
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
注意函数的返回值不做为重载的条件
void myPrint(int a)
{
cout << "a = " << a << endl;
} void myPrint(char *p)
{
cout << "p = " << p << endl;
} void myPrint(int a, int b)
{
cout << "a = " << a << "b = " << b << endl;
}
重载例子
重载的规则,和注意事项
编译器调用重载函数的准则
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败。 函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。 函数重载是发生在一个类中里面
当函数重载遇上默认参数
void fun(int a) { cout << "a" << endl; } void fun(int a, char c='a') { cout << "a c"<<endl; } int main() { fun(); // 二义性报错 return ; }
当函数重载遇到const, reference , 指针 重点
普通重载(加上const也不可以), 引用和引用(常量和非常量可以),指针和指针(常量和非常量可以),引用和指针(都可以)
普通const, 二义性
void fun(const int a)
{
cout << "a" << endl;
}
void fun(int a)
{
cout << "a "<<endl;
}
int main()
{
fun(); // 二义性报错
return ;
}
普通const
const指针和普通指针 可以重载
void fun(const int *a) 常
和
void fun(int *a)可以重载
但是int * const a 不能与int*a
//const 指针
void fun(const int *a)
{
cout << "const int b = 20 调用时形参:const int *a" << endl;
}
void fun(int *a)
{
cout << "int a = 10 调用时形参: int *a"<<endl;
}
int main()
{
int a = ;
fun(&a);
const int b = ;
fun(&b);
cout << "可以重载"<<endl;
return ;
}
指针和普通指针
const引用(常量引用)和const指针一样可以
引用和引用
void fun(const int &a) 和 void fun(int &a)可以重载
引用和指针
void fun(int &a) 和 void fun(int *a)可以重载, 加上const也可以,因为本来就是两种不同类型
// 重载 重写重定义
// 重写发生在两个类之间
// 重载必须在一个类之间
// 重写分为两类
// 1虚函数重写 将发生多态
// 2非虚函数重写 (重定义)
后面写
C++对c中函数的拓展,函数重载的更多相关文章
- avascript中的this与函数讲解
徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...
- ES6必知必会 (二)—— 字符串和函数的拓展
字符串的拓展 1.ES6为字符串添加了遍历器接口,因此可以使用for...of循环遍历字符串 2.字符串新增的 includes().startsWith().endsWidth() 三个方法用于判断 ...
- ES6 随记(3.4.1)-- 函数的拓展(参数默认值,扩展运算符)
上一章请见: 1. ES6 随记(1)-- let 与 const 2. ES6 随记(2)-- 解构赋值 3. ES6 随记(3.1)-- 字符串的拓展 4. ES6 随记(3.2)-- 正则的拓展 ...
- SQL中Round(),Floor(),Ceiling()函数的浅析
项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...
- 【repost】js中(function(){…})()立即执行函数写法理解
摘要: javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ...
- Qt 5.0+ 中 connect 新语法与重载函数不兼容问题的解决方法,以及个人看法
Qt 5.0+ 版本提供了 connect 的新语法,相比之前的语法新语法可以提供编译期检查,使用也更方便.可是使用过程中发现一个小问题——当某个 signal 和成员函数是重载关系的时候,qmake ...
- Oracle中的CHR()函数与ASCII()函数
工作中经常会处理一些因特殊字符而导致的错误,如上周我就遇到了因为换行符和回车符导致的数据上报的错误,这种错误比较难以发现,通常是由于用户的输入习惯导致的,有可能数据极少,就那么几行错误从而导致整个数据 ...
- javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...
- PHP中有关正则表达式的函数集锦
之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...
随机推荐
- vue和react的区别
数据: vue:双向数据绑定和单向数据流.双向数据绑定:DOM元素绑定的data值,当发生改变后,vue的响应式机制会自动监听data的变化重新渲染.单向数据流:当父组件给子组件传递数据的时候,子组件 ...
- 简析平衡树(四)——FHQ Treap
前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...
- NLP中一些数学知识
1.所谓概率函数就是要在整个样本空间分配概率值,概率值总和为1 2.一个完备的概率空间应该由样本空间,概率函数和事件域这三部分组成,在统计自然语言处理中,我们的目标就是为建立的模型定义一个符合上述条件 ...
- Linux性能优化实战学习笔记:第五十讲
一.上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法.先简单回顾一下. 当碰到内核线程的资源使用异常时,很多常用的进程级性能 ...
- [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项之二
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- [LeetCode] 41. First Missing Positive 首个缺失的正数
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- JavaScript (JS)常用方法
被按的按键的 unicode 是? <html> <head> <script type="text/javascript"> function ...
- 这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框架的时候。
一.什么是泛型 泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能分别写多个方法 ...
- JavaScript 系列--JavaScript一些奇淫技巧的实现方法(三)数字取整,数组求和
一.前言 简短的sleep函数,获取时间戳:https://www.mwcxs.top/page/746.html 数字格式化 1234567890 --> 1,234,567,890:argr ...
- Mybatis成为Java互联网时代首选持久框架的原因
持久层可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏(大部分的重要数据都会有相关的备份机制),在断电或者其他情况下,重新开启系统仍然可以读取这些数据.一般执行持久任务的都是数据库系统.持久 ...