zoukankan      html  css  js  c++  java
  • 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释放

      1 #include <iostream>
      2 using namespace std;
      3 int main() {
      4     int *parr = new int[5];
      5     for(int i = 0; i < 5; i++) {
      6         *(parr + i) = i + 1;
      7     }
      8     delete[] parr;
      9     union{
     10         char data[20];
     11         int m;
     12     };
     13     cout << "---------------------------" << endl;
     14     //char data[20];
     15     int *parr2 = new(data)int[5];
     16     cout << data << endl;//看到char数组,编译器自动当字符>    串使用
     17     cout << parr2 << endl;
     18     cout << (void*)data << endl;
     19     cout << &m << endl;//m和data的地址一样,取到m的地址就>    是data的地址
     20     return 0;
     21 }

  • 相关阅读:
    04737_C++程序设计_第6章_继承和派生
    04737_C++程序设计_第5章_特殊函数和成员
    网易云课堂_C语言程序设计进阶_第四周:ACL图形库
    网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合_1学生成绩简单统计
    网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合
    网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告
    网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_1删除字符串中的子串
    网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配
    python函数(一)
    Adaboost
  • 原文地址:https://www.cnblogs.com/dongjian16/p/6847020.html
Copyright © 2011-2022 走看看