4.函数的默认参数

1.函数的默认参数

  默认参数指的是当函数调用中省略了实参时自动使用的一个值。这极大地提高了使用函数的灵活性。

  如何设置默认值?

  必须通过函数原型。由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。例如,left()的原型如下:

char * left(const char * str, int n = 1);

  对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它的右边的所有参数提供默认值。

int harpo(int n, int m = 4, int j = 5);//有效
int chico(int n, int m = 6, int j);//无效
int groupcho(int k = 1, int m = 2, int n = 3);//有效

  例如,harpo()原型允许调用该函数时提供1个、2个或3个参数:

beeps = harpo(2);//和harpo(2, 4, 5)相同
beeps = harpo(1, 8);//和harpo(1, 8, 5)相同
beeps = harpo(8, 7, 6);//没有默认参数被使用

  实参从左到右的顺序依次被赋给相应的形参,而不能跳过任何参数。因此,下面的调用是不允许的:

beeps = harpo(3, ,8);//无效

  默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在设计类时发现,通过使用默认参数,可以减少要定义的析构函数、方法以及重载的数量。

程序:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月23日21:22:29
//left.cpp--带有一个默认值的string函数
#include <iostream>
const int Arsize = 80;
char *left(const char *str, int n = 1);

int main()
{
    using namespace std;
    char sample[Arsize];
    cout << "Enter a string:\n";
    cin.get(sample, Arsize);
    char *ps = left(sample, 4);
    cout << ps << endl;
    delete[] ps;//释放旧的字符串
    ps = left(sample);
    cout << ps << endl;
    delete[] ps;//释放新的字符串

    return 0;
}

//这个函数返回一个指向新字符串的指针,在str字符串中,它指向前n个字符
char *left(const char *str, int n)
{
    if( n < 0 )
        n = 0;
    char *p = new char[n + 1];
    int i;
    for( i = 0; i < n && str[i]; i++ )
        p[i] = str[i];//复制字符串
    while( i <= n )
        p[i++] = '\0';//设置一个空位置给'\0'

    return p;
}

输出结果:

Enter a string:
forthcoming
fort
f


//2022年8月20日09:05:03
#include <iostream>
using namespace std;

int myFunc(int a, int b = 0)//int b = 0;这就是函数的默认参数,不一定是0
{
    return a + b;
}

void test01()
{
    //函数的默认参数的作用
    //当函数内常要用到形参的某个值,但偶尔要使用其他值
    //增加函数的灵活性
    cout << myFunc(10, 20) << endl;
    cout << myFunc(10) << endl;
}

//注意1:函数的默认参数后面的参数必须都是默认参数
int myFunc2(int a, int b = 0, int c=2, int d=3)
{
    return a + b + c + d;
}

//注意2:函数的声明和实现不能同时有函数的默认参数
void myFunc3(int a, int b);
void myFunc3(int a, int b = 0)
{

}

//函数的占位参数,占位参数在后面运算符重载时区分前加加后加加
void func(int a, int = 10)//占位参数也有默认值
{

}

void test02()
{
    func(10);
}

//占位参数和默认参数混搭
void func2(int=10, int a = 20)
{

}

void test03()
{
    func2();
    func2(10);
    func(10, 30);
}

int main04()
{
    test01();
    test02();
    test03();
    system("pause");
    return EXIT_SUCCESS;
}

参考资料

参考资料来源于黑马程序员等

posted @ 2022-08-20 09:42  CodeMagicianT  阅读(88)  评论(0编辑  收藏  举报