• C++ 默认参数(转载)


    函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。

    复制代码
    void Func(int i = 1, float f = 2.0f, double d = 3.0)
    {
        cout << i << ", " << f << ", " << d << endl ;
    }
    
    int main(void)
    {
        Func() ; // 1, 2, 3
        Func(10) ; // 10, 2, 3
        Func(10, 20.0f) ; // 10, 20, 3
        Func(10, 20.0f, 30.0) ; // 10, 20, 30
    return 0 ;
    }
    复制代码

    参数的值也可以是表达式,这样,表达式将在函数被调用的时候求值,比如下面的func函数,第二个参数值是通过函数调用得到的,每次调用func函数时,该函数都会调用getValue来获取b的值。

    复制代码
    class Test
    {
    public:
    
        static int getValue()
        {
            return 1;
        }
    
        int func(int a, int b = getValue())
        {
            return b;
        }
    } ;
    复制代码

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

    下面两种情况都可以

    void Func(int i, float f = 2.0f, double d = 3.0) ;
    void Func(int i, float f, double d = 3.0) ;

    但是这样就不可以

    void Func(int i, float f = 2.0f, double d) ;

    默认参数的连续性能保证编译器正确的匹配参数。所以可以下这样一个结论,如果一个函数含有默认参数,那么它的最后一个参数一定是默认参数。

    默认参数可以放在函数声明或者定义中,但只能放在二者之一

    通常我们都将默认参数放在函数声明中,因为如果放在函数定义中,那么将只能在函数定义所在地文件中调用该函数。(为什么呢?)

    .h文件

    class TestClass
    {
    public:
        void Func(int i, float f, double d) ;
    };

    .cpp文件

    #include "TestClass.h"
    
    void TestClass::Func(int i = 1, float f = 2.0f, double d = 3.0)
    {
        cout << i << ", " << f << ", " << d << endl ;
    }

    像上面这样,只能够在TestClass.cpp中调用Func函数。岂不是很痛苦?

    函数重载时谨慎使用默认参数值

    比如下面两个重载函数func,一个只接受一个参数,而另一个接受两个参数,包括一个默认参数。

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

    如果像下面这样调用函数

    复制代码
    int main(void) 
    { 
        Test test;
        int result = test.func(1);
    
        getchar() ; 
        return 0 ; 
    } 
    复制代码

    则编译器就不知道选择哪个函数,这就造成了混淆。

    ==

    作者:zdd
    出处:http://www.cnblogs.com/graphics/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Window_Open详解
    ajax josn 城市
    图片在容器里垂直居中
    Asp.Net 分段,断点,下载
    HTTP Range
    看得懂的看
    反射访问非公共成员
    C# Rijndael 大文件 分割/合并 并 加密
    在存储过程中如何实现将id列表字符串传入in()
    《植物大战僵尸》网页脚本版
  • 原文地址:https://www.cnblogs.com/litmin/p/7491348.html
Copyright © 2020-2023  润新知