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 }

原文地址:https://www.cnblogs.com/dongjian16/p/6847020.html