函数的参数的哑元和默认值
一、函数参数的哑元
概念:一个函数的参数,只有类型,没有形参名
作用:向前兼容函数
void decode(int key) { }
void decode(int) { }
区分函数
Date date = {2014, 3, 13};
++date;
operator++() {} //表示前++
date++;
operator++(int ) {} //表示后++
二、参数的默认值(缺省参数)
2.1 作用
在设计一个函数的参数时,可以给这个参数指定一个值,如果在调用函数时不给这个参数赋值,则参数使用指定的值,如果传入了值,则参数使用传入的值
简化调用,简化函数的个数
2.2 举例
要求两个数大小,函数参数为三个数时,只要第三个数有默认值,就可以只传两个参数,第三个用本身的默认值
1 #include <iostream>
2 using namespace std;
3 int getMax(unsigned int x, unsigned int y, unsigned int z = 0) {
4
5 }
6
7 int main() {
8 getMax(1, 2, 0);//我们要求两个数的大小,第三个数没用,但是为了> 和函数匹配,得传最小的0
9 getMax(2, 1);
10 }
2.3 函数缺省函数的注意事项
不要和重载构成冲突:
例如:
int getmax(int x, int y, int z = 0){}
int getmax(int x, int y) {}
调用getmax(2, 1);发生冲突,不知道该调用哪个函数
参数的缺省值,必须靠右(一个参数有默认值,则这个参数右边的所有参数都必须带默认值)
2.4 设计一个函数,输出整数数组的值(默认输出数组的前五个数据,如果不够五个需要传入数组元素个数,并且默认以‘,‘分隔数据
可以通过第三个参数指定分隔符号
1 #include <iostream>
2 using namespace std;
3
4 int printArr(int* arr, unsigned int num = 5, char symbol = ‘,‘) {
5 for(int i = 0; i <= num - 2; i++) {
6 cout << arr[i] << symbol;
7 }
8 cout << arr[num - 1] << endl;
9 }
10 int main() {
11 int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
12 printArr(arr, 6);
13 printArr(arr);
14 printArr(arr, 10);
15 return 0;
16 }
当声明和实现分开时,在声明中指定默认值,在实现中不能指定
1 #include <iostream>
2 using namespace std;
3 void printArr(int* arr, int num = 5, char symbol = ‘,‘);
4 int main() {
5 int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
6 printArr(arr, 6);
7 printArr(arr);
8 printArr(arr, 10);
9 printArr(arr, 3, ‘#‘);
10 return 0;
11 }
12
13 void printArr(int* arr, int num, char symbol) {
14 for(int i = 0; i <= num - 2; i++) {
15 cout << arr[i] << symbol;
16 }
17 cout << arr[num - 1] << endl;
18 }
三、内联函数
在函数调用时,直接把函数的二进制代码粘贴过去
和宏是有区别的,具备函数的一切特性
调用频繁,函数比较小(100行以内)适合内联
调用稀少,函数比较大,不适合
递归无法实现内联
inline void testline() { }
inline只是一种请求,请求成功与否看编译器
四、c++中的内存分配
c中的内存分配 malloc calloc realloc
free
c++中使用
类型 *指针名 = new 类型名; delete 指针;
类型 *指针名 = new 类型名[n]; delete[] 指针名;
int *parr = new int[5];
for(int i = 0; i < 5; i++) {
//*parr++ = i + 1;//典型错误,指针不能乱动,这样做par指向最后一个字节,delete释放的时候找不到内存了
//parr[i] = i + 1; //正确
//*(parr + i) = i + 1; //正确
}
/*使用delete[]释放掉new[]申请的内存*/
delete[] parr;
定位内存分配(了解)
char data[20]; //栈
int *parr = new int[5]; //堆
int *parr = new (data)int[5] //在栈中,这两个内存位置一致,不需要delete释放
20170512
时间: 2024-10-22 07:25:37
20170512的相关文章
CSDN日报20170512 ——《程序员,你为什么值这么多钱?》
[程序人生]程序员,你为什么值这么多钱? 作者:瞬息之间 听说一段时间不加薪,人就会开始思考起和工资有关的问题.消费水平又提升了,能力也进步了,经验也更多了,怎么还没涨工资呢? 点击阅读全文 [OS]如何看待 Google 最新的系统 Fuchsia? 作者:stormzhang 想必大家都知道了,前几天 Google 曝光了新 OS Fuchsia 的部分信息与 UI,已经很多人在后台给我留言,让我说说看法,那么趁我还没去美国,就给大家写篇文章普及下,顺便说下我个人对 Fuchsia 系统的期
20170512 Python练习册0001生成激活码
#!/usr/bin/env python# -*-coding:utf-8-*- # 第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),# 使用 Python 如何生成 200 个激活码(或者优惠券)? import stringimport random Key_len = 20Key_all = 200 def base_str(): return (string.ascii_letters + string.digit
用ajax判断用户是否已存在?----2017-05-12
首先在用ajax之前,先说一下JSON: JSON:javascript object notation js对象标记 对于json,我们只需要知道如何定义json?如何输出?怎么遍历? 1.定义json var a = { "one":"111", "two":"222", "three":arr, -------可以是数组(var arr=new Array(2,3,4)) "fo
问题 1018: C语言程序设计教程(第三版)课后习题6.8
/******************************************************************** @file Main.cpp @date 2017-05-12 @author Zoro_Tiger @brief 问题 1018: C语言程序设计教程(第三版)课后习题6.8 http://www.dotcpp.com/oj/problem1018.html *************************************************
第16篇-JAVA 类加载与反射
第16篇-JAVA 类加载与反射 每篇一句 :敢于弯曲,是为了更坚定的站立 初学心得: 追求远中的欢声笑语,追求远中的结伴同行 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-12| JAVA 类加载与反射 ] 1.类加载 类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载.连接.初始化三个步骤来对该类进行初始化,如果没
部署应用的小脚本
1 #!/bin/bash 2 # Author : standby 3 # Date : 2017-05-12 4 # Description : Deploy something. 5 6 . /etc/init.d/functions 7 8 # Usage... 9 function Usage() 10 { 11 echo -e "Usage: /bin/sh $0 arg1 arg2\n \ 12 - arg1 like this : data1 | data2 ...\n 13 -
小谈-—ServletConfig对象和servletContext对象
一.servletContext概述 servletContext对象是Servlet三大域对象之一,每个Web应用程序都拥有一个ServletContext对象,该对象是Web应用程序的全局对象或者上下文.Tomcat服务器在启动时,会自动创建一个ServletContext对象,在关闭时,会自动销毁这个ServletContext对象.每个Web应用程序只拥有一个ServletContext对象,ServletContext对象可以在整个Web应用中共享数据资源. 生命周期很长 每个web应
Python 多进程多线编程模板
一.Python 多进程多线程原理介绍 1. Python 全局解释器锁GIL a) Python的全局解释器锁GIL是互斥锁,能够防止本机多个线程一次执行Python字节码:由于CPython的内存管理在线程级别是不安全的(内存泄露),所以这个全局解释器锁是必须的.每个Python进程只能申请使用一个GIL锁,因此Python的多线程虽然是并发的但不能并行处理.Python的解释器每次只能执行一个线程,待GIL锁释放后再执行下一个线程,这样线程轮流被执行. b) Python2.x里,GIL的
进程管理及计划任务
进程的概念: 内核的功用:进程管理,文件系统,网络功能,内存管理, 驱动程序,等 process:运行中的程序的一个副本,是被载入内存的一个指令集合 进程ID(process ID,PID)号码被用来标记各个进程,UID, GID和SELinux语境决定对文件系统的存取和访问权限.通常从执行进程的用户来继承 在Centos6以前第一个进程init Centos7是systemd 为父子关系 进程:都是由其父进程创建,使用cow机制,(写时复制) 在没有写之前父子功用同一个空间,之后子进程单独