20170512
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170512相关的知识,希望对你有一定的参考价值。
函数的参数的哑元和默认值
一、函数参数的哑元
概念:一个函数的参数,只有类型,没有形参名
作用:向前兼容函数
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的主要内容,如果未能解决你的问题,请参考以下文章