07-函数参数的扩展

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

 

一、函数参数的默认值

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

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

int mul(int x = 0);	//声明时有默认值

int main(int argc, char *argv[])
{
    printf("%d\n", mul());	//mul(0)
    return 0;
}

int mul(int x)
{
    return x * x;
}

 

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

      问题:

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

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

int mul(int x = 0);

// ……

int mul(int x = 5)
{
    return x * x;
}
	
int r = mul();	//r = 0;
如果r的值是什么?
int r = mul();

 

实例分析
默认参数值初探
7-1.cpp
#include <stdio.h>

int mul(int x = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", mul());    //使用了默认值0
    printf("%d\n", mul(-1));
    printf("%d\n", mul(2));
    
    return 0;
}

int mul(int x)
{
    return x * x;
}

操作:

1) g++ 7-1.cpp -o 7-1.out编译成功,运行结果:

0
1    
4    

2) 修改代码,定义mul()时增加形参默认值:

#include <stdio.h>

int mul(int x = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", mul());    //使用了默认值0
    printf("%d\n", mul(-1));
    printf("%d\n", mul(2));
    
    return 0;
}

int mul(int x = 5)
{
    return x * x;
}

g++ 7-1.cpp -o 7-1.out编译报错:

7-1.cpp:14:18: error: default argument given for parameter 1 of 'int mul(int)'
    int mul(int x = 5)
错误:参数1给了默认值

7-1.cpp:3:5: error: after previous specification in 'int mul(int)'
    int mul(int x = 0);

程序结论:声明提供默认值,定义时不提供。

 

4)函数默认值参数的规则

 - 参数的默认值必须从右向左提供(参见C进阶函数参数秘密)

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

int add(int x, int y = 1, int z = 2)
{
    return x + y + z;
}

add(0);		// x = 0, y = 1, z = 2;
add(2,3);	// x = 2, y = 3, z = 2;
add(3,2,1);	// x = 3, y = 2, z = 1;

注意:设计函数时要从右向左考虑,例如,int add(int x, int y = 0, int z)会报错,更换形参顺序(y,z)可以解决问题。

 

编程实验
默认参数的错误示例
7-2.cpp
#include <stdio.h>

int add(int x, int y = 0, int z = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", add(1));        //x=1 y=0 z=0
    printf("%d\n", add(1, 2));     //x=1 y=2 z=0
    printf("%d\n", add(1, 2, 3));  //x=1 y=2 z=3  
    
    return 0;
}

int add(int x, int y, int z)
{
    return x + y + z;
}

操作:

1) g++ 7-2.cpp -o 7-2.out编译正常,打印结果:

1
3 
6    

2) 去掉add()函数声明时z的默认值

#include <stdio.h>

int add(int x, int y = 0, int z);

int main(int argc, char *argv[])
{
    printf("%d\n", add(1));        //x=1 y=0 z=0
    printf("%d\n", add(1, 2));     //x=1 y=2 z=0
    printf("%d\n", add(1, 2, 3));  //x=1 y=2 z=3  
    
    return 0;
}

int add(int x, int y, int z)
{
    return x + y + z;
}

g++ 7-2.cpp -o 7-2.out编译错误:

7-2.cpp:3:5: error:default argument missing for parameter 3 of 'int add(int, int, int)'
    int add(int x, int y = 0, int z);
错误:int add(int, int, int)参数3丢失默认值。

 

二、函数占位参数

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

     -    占位参数只有参数类型声明,而没有参数名声明(在C中的函数指针和转换表中使用过)

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

int func(int x, int)
{
    return x;
}

//...

func(1, 2);	//ok!

2)函数占位参数的意义

     -    占位参数与默认参数结合起来使用

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

 

下面的两种声明方式等价吗?

void func(); <--> void func(void);

C:不等价,无参数可以接受任意类型且多个参数;void表示参数为空。测试:gcc

C++:等价。测试:g++

       void func(),在C语言下可以执行;在C++下不可以执行!证明C++对于程序类型检查更严谨。 

 

编程实验
占位参数与默认参数值(为了兼容C中不规范写法)
7-3.cpp
#include <stdio.h>


int func(int x = 0, int = 0)    //c++
{
    
}

int main(int argc, char *argv[])
{
    func();
    func(1,2);
    
    return 0;
}

操作:

1) C++版本代码:g++ 7-3.cpp -o 7-3.out编译正常

2) C版本代码:

#include <stdio.h>

int func()    
{
    
}

int main(int argc, char *argv[])
{
    func();
    func(1,2);
    
    return 0;
}

gcc 7-3.c -o 7-3.out编译正常。 

分析:

        从C版本移植到C++版本,只需要增加默认值x=0,和占位参数int = 0即可。编译器对函数形参处理是从右至左。

 

小结:

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

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

3)参数的默认值必须从右向左提供

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值