zoukankan      html  css  js  c++  java
  • c++ 函数的默认参数

     /** 
     * @file test.cpp
     * @author chenjiashou(chenjiashou@baidu.com)
     * @date 2017/08/20 15:54:27
     * @version $Revision$ 
     * @brief 
     *  
     **/
    
    #include <iostream>
    
    int print(int a = 1, int b = 2); 
    
    int main() {
        print();
        print(-1);
        return 0;
    }
    
    //int print(int a = 1, int b = 2) {// 编译错
    int print(int a, int b) {
        std::cout << a << "," << b << std::endl;
    }

    结果:

    1,2
    -1,2

    首先看上述的代码,print函数是带有默认参数的。

    所以调用print(), print(-1)都可以准确的输出。

    这种默认参数的情况会带来有些便利。(比如初始化一个商品对象,在99%的情况在都是正常的,那么这个商品是否正常的标记就可以默认为1,特殊的1%情况,再加上)

    但是有以下三个要注意的情况。

    1. 默认参数只能放在函数声明处或者定义处,能放在声明处就放在声明处 。

    上述代码把那行注释打开,默认参数在声明和定义处都有了,那么就会有编译错误。(两次默认赋值是不被允许的。)

    a. 大部分情况,别人调用你的代码只能看到函数声明,如果你写在定义处,别人根本不知道你的默认参数是什么。

    b.如果你是在定义处写的默认参数,那么你在使用该函数前就需要把函数定义放在前面。不然编译阶段通过无默认参数的函数声明无法确定这个函数是带默认参数的。

    所以,默认参数写在声明处啊。^ ^

    2.如果某个参数是默认参数,那么它后面的参数必须都是默认参数

    因为非默认参数的参数必须要给出具体值,而调用函数传递参数的时候是从左到右的,所以非默认参数前面的都必须要传值进来。

    那么默认参数后面的当然也得都为默认参数。

    3.不要重载一个带默认参数的函数

    看下这个函数:

    class Test
    {
    public:
        int func(int a)
        {
            return a;
        }
    
        int func(int a, int b = 1)
        {
            return a + b;
        }
    } ;

    你调用func(1)的时候,谁知道你想调用哪一个。

  • 相关阅读:
    百度面试题:把数组排成最小的数
    面试题:在O(1)时间删除链表结点
    从第一字符串中删除第二个字符串中所有的字符
    在一个字符串中找到第一个只出现一次的字符
    大整数运算
    输出1到最大的N位数
    删除字符串中的数字并压缩字符串
    排列 或组合问题的解法(包含回溯法)
    卡特兰数(Catalan)简介
    编程之美-分层遍历二叉树
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/7400378.html
Copyright © 2011-2022 走看看