zoukankan      html  css  js  c++  java
  • C++中函数参数的扩展

    1,C++ 可以看成是一种更好的 C 语言,所以 C++ 会考虑 C 的欠缺部分,然后给  与一些补充和扩展,本节课讲述 C++ 对函数参数的非常重要的扩展;

     

    2,函数参数的默认值:

        1,C++ 中可以在函数声明时为参数提供一个默认值;

           1,也可以在函数声明和定义在一起的时候来提供默认值;

        2,作用是当函数调用时没有提供参数的值,则使用默认值;

        3,int mul(int x = 0);  // 函数的前项声明,这里使用了默认值;

     1 int main(int argc, char* argv[])
     2 {
     3     printf("%d
    ", mul());  // mul(0)
     4 
     5     return 0;
     6 }
     7 
     8 int mul(int x)  //函数声明的时候提供默认值,定义的时候没有必要提供;
     9 {
    10     return x * x;
    11 }

     

    3,参数的默认值必须在函数声明中指定:

        1,问题:

           1,函数定义中是否可以出现参数的默认值?

               1,不可以,编译出错;

               2,当函数声明和定义在一起的时候,可以出现参数的默认值;

           2,当函数声明和定义中的参数默认值不同时会发生什么?

               1,不可以,编译出错;

        2,代码示例:

    1 int mul(int x = 0);
    2 
    3 // ...
    4 
    5 int mul(int x = 5)
    6 {
    7     return x * x;
    8 }

        3,默认参数值初探实例分析:

           1,main.cpp 文件:

     1 #include <stdio.h>
     2 
     3 int mul(int x = 0);
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     printf("%d
    ", mul());
     8     printf("%d
    ", mul(-1));
     9     printf("%d
    ", mul(2));
    10     
    11     return 0;
    12 }
    13 
    14 int mul(int x)
    15 {
    16     return x * x;
    17 }
    18 
    19 /*
    20 int mul(int x = 5)  // error: default argument given for parameter 1 of 'int mul(int)'
    21 {
    22     return x * x;
    23 }
    24 */

    2,输出结果:

         0

         1

         4

    3,当上述代码用 C 语言编译时,第三行有错,证明了函数参数的默认值   是 C++ 语言对 C 语言的一个扩展;

     

    4,函数默认参数的规则:

        1,函数设计时,多个参数的默认值必须从右向左提供;

           1,这个设计,是指函数声明或者函数声明和定义在一起的时候;

        2,函数调用时,使用了默认值,则后续参数必须使用默认值;

    1 int add(int x, int y = 1, int z = 2)  // 这里即是声明,也是调用;
    2 {
    3      return x + y + z;
    4 }
    5 
    6 add(0);  // x = 0, y = 1, z = 2;
    7 add(2, 3);  // x = 2, y = 3, z = 2;
    8 add(3, 2, 1);  // x = 3, y = 2, z = 1;

       

    5,默认参数的错误示例编程实验:

        1,main.cpp 文件:

     1 #include <stdio.h>
     2 
     3 int add(int x, int y = 0, int z = 0); //当 z 未提供默认值的时候,编译器显示:error: default argument missing for parameter 3 of 'int add(int, int, int)'
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     printf("%d
    ", add(1));
     8     printf("%d
    ", add(1, 2));
     9     printf("%d
    ", add(1, 2, 3));
    10     
    11     return 0;
    12 }
    13 
    14 int add(int x, int y, int z)
    15 {
    16     return x + y + z;
    17 }

        2,输出结果:

           1

           3

           6.

     

    6,函数占位参数:

        1,在 C++ 中可以为函数提供占位参数;

           1,占位参数只有参数类型声明,而没有参数名声明;

               1,占位参数本质也是函数参数;

               2,占位参数:有类无名; 

           2,一般情况下,在函数体内部无法使用占位参数;

               1,没有名字,所以在函数体内部无法使用;

        2,代码示例:

    1 int func(int x, int)
    2 {
    3      return x;
    4 }
    5 
    6 // ...
    7 
    8 func(1, 2);  // ok,这是占位参数的用途;

     

    7,函数占位参数的意义:

        1,占位参数与默认参数结合起来使用;

        2,兼容 C 语言程序中可能出现的不规范写法;

           1,void func(); 与 void func(void); 两种声明方式等价吗?

               1,在 C 语言中,前者接受任意多参数,后者不接受参数,因此不 等价;

               2,在 C++ 语言中,等价;

           2,在 C++ 中,最少的改动,就能够兼容 C 程序,且不用带来 bug;

           3,代码示例:

     1 #include <stdio.h>
     2 
     3 void func()  // 从 C 到 C++,更改为 void func(int, int)即可;
     4 {
     5 }
     6 
     7 int mian(int argc, char* argv[])
     8 {
     9     // func();  //若在 C 中也有这一行代码,C++ 中只用占位参数时,这里错误,可以结合默认参数值,更改为 void func(int = 0, int = 0);
    10     func(1, 2);  // C++ 中不用占位参数时,这里错误;
    11     
    12     return 0;
    13 }

     

    8,占位参数与默认参数值编程实验:

        1,main.cpp 文件:

     1 #include <stdio.h>
     2 
     3 int func(int x, int = 0);
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     printf("%d
    ", func(1));  // 利用默认参数;
     8     printf("%d
    ", func(2, 3));  // 利用占位参数;
     9     
    10     return 0;
    11 }
    12 
    13 int func(int x, int)
    14 {
    15     return x;
    16 }

    9,小结:

        1,C++ 中支持函数参数的默认值;

        2,如果函数调用时没有提供参数值,则使用默认值;

        3,参数的默认值必须使从右向左提供;

        4,参数调用时使用了默认值,则后续参数必须使用默认值;

        5,C++ 中支持占位参数,用于兼容 C 语言中的不规范写法;

  • 相关阅读:
    MaskRCNN模型解读
    Centos7下WebLogic安装部署
    CentOS 7 安装 JAVA环境(JDK 1.8)
    Linux下如何查看tomcat是否安装、启动、文件路径、进程ID
    Nacos enable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    多线程系列(三)之线程池
    多线程系列(二)之Thread类
    多线程系列(一)之多线程基础
    Vue2/Vue3 自定义组件库
    EF Core使用单独的项目管理迁移
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10902974.html
Copyright © 2011-2022 走看看