函数参数的扩展(六)

在 C++ 中可以在函数声明时为参数提供一个默认值,当函数调用时没有提供参数的值时,则使用默认值。函数的默认值必须在函数声明中指定,那么在函数定义中是否可以出现参数的默认值呢当函数声明和定义中的参数默认值不同时会发生什么呢?我们通过实例代码进行分析

#include <stdio.h>

int mul(int x = 0);

int main(int argc, char *argv[])
{
    printf("mul() = %d\n", mul());
    printf("mul(-1) = %d\n", mul(-1));
    printf("mul(2) = %d\n", mul(2));

    return 0;
}

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

我们看到在声明函数 mul 时,我们将参数默认声明为 0,我们来看看这个程序可以编译成功吗?如果可以,在 main 函数中会打印出什么?

我们发现它没有报错,也就是说在 C++ 中支持在函数声明时,支持参数默认值。那我们试试在 C 语言比那一起中是否也支持这样的写法呢?

我们看到这样的写法在 C 语言的编译器中是不支持的,那么我们试试在定义中给默认值,声明中不给呢,看 g++ 编译器是否支持

我们看到它报错了,所以只能在声明时给参数默认值。

那么函数既然支持参数默认值,那它在多个参数设置时有没有规则呢?有两条规则:a> 参数的默认值必须从右向左提供;b> 函数调用时使用了默认值,则后续参数必须使用默认值。

我们以代码为例进行分析

#include <stdio.h>

int add(int x, int y = 1, int z = 2);

int main(int argc, char *argv[])
{
    printf("add(1) = %d\n", add(1));            // 4
    printf("add(1, 2) = %d\n", add(1, 2));        // 5
    printf("add(1, 2, 3) = %d\n", add(1, 2, 3));// 6

    return 0;
}

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

我们分析下这个代码,默认参数 y 和 z 的值分别为 1 和 2。那么 main 函数中的返回值分别为 1 + 1 + 2 = 4; 1 + 2 + 2 = 5; 1 + 2 + 3 = 6;我们来看看结果是否如此呢?

我们看到结果确实是如我们所分析的那样。那么我们试试只给 y 默认值,也就是说不遵循从右向左分配,看看会编译成功吗?

我们看到编译报错了,那么如果只想给 y 默认值该怎么做呢?只需把 y  和 z 的位置换下就行,将它放在最右边。

下来我们来说说函数占位参数,在 C++ 中可以为函数提供占位参数。占位参数只有参数类型声明,而没有参数名声明;在一般情况下,在函数体内部无法使用占位参数。

我们以代码为例,看看函数占位参数是什么样的

#include <stdio.h>

int func(int x, int);

int main(int argc, char *argv[])
{
    printf("func(1, 2) = %d\n", func(1, 2));

    return 0;
}

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

我们试试能否编译通过呢

我们看到编译是通过的,那么我们是不是觉得这是多此一举呢?明明只是个需要一个参数,却多了一个占位参数。下来我们就来讲下函数占位参数的意义,占位参数与默认参数结合起来使用,兼容 C 语言程序中可能出现的不规范写法。我们还记得之前那么 void func() 和 void func(void) 等价这个问题嘛,在 C 语言中它是不等价的,因为第一个是代表可接受任意多的参数,而后一个是不接受参数。而在 C++ 中它们两个表达的意思是一样的。

通过对函数占位参数的 学习,总结如下:1、C++ 中支持参数的默认值;2、如果函数调用时没有提供参数值,则使用默认值;3、参数的默认值必须从右向左提供;4、函数调用时使用了默认值,则后续参数必须使用默认值;5、C++ 中支持占位参数,用于兼容 C  语言中的不规范写法。

欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2113204

时间: 2024-10-07 22:51:26

函数参数的扩展(六)的相关文章

第7课 函数参数的扩展

1.  函数参数的默认值 (1)C++中可以在函数声明时为参数提供一个默认值(注意是声明,不能在定义中提供) (2)当函数调用时没有提供参数的值,则使用默认值 [实例分析]默认参数值初探 #include <stdio.h> //默认值只能在函数声明时提供 int mul(int x = 0); //参数x的默认值为0 int main() { printf("%d\n", mul()); //传入默认值0 printf("%d\n", mul(-1))

C++对C的函数的扩展==》函数参数相关扩展

三块内容:1 默认参数 2 函数占位参数 3 默认参数和占位参数 1 默认参数 2 占位参数 3 默认参数和占位参数

C++函数参数的扩展

C++中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 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; }

C++中对C的扩展学习新增语法——内联函数以及函数参数

内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个cpp包含时不会引起重定义. 如果出现连接错误: 使用第三方库,没有将其库代码配置到项目,所以导致编译器找不到实现(变量定义,函数定义) 本身自己只写了声明,根本没有定义实现. 变量本身.函数本身具有内部链接属性,此函数或者变量只能在当前文件访问. 函数参数 函数参数的作用 兼容C语言中不规范的语法

python基础教程函数参数

python里有很多的内置函数给我们的工作带来了很多发便利,在我们实现某些功能或者优化代码的时候,可以自己定义一个函数,同时我们在定义一个类的时候也会用到函数的一些知识去构造一个方法,这里就涉及到一些关于函数的基础知识和函数传参的知识. 一.函数的相关介绍 1.函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 函数特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 2.函数的定义示例 定义一个函数要使用def语句,依次写出函数名.括

VBA自定义函数参数类型不符的错误

作者:iamlaosong 1.问题提出 编程中发现一个问题,系统总是提示编译错误,ByRef 参数类型不符, 可实际上参数定义没问题,原因在哪儿呢? 2.问题环境 假定函数定义如下: Function get_kind(addr As String) As Integer ...... End Function 调用过程: Sub check_address() Dim addr, new_addr(10000) As String ...... addr = new_addr(i) ....

C语言中的system函数参数详解

http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令 用   法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system()函数用于向操作系统传递控制台命令行,以WINDOWS系统为例,通过system()函数执行命令和在DOS窗口中执行命令的效果是一样的,所以只要在运行窗口中可以使用的命令都可以用SYSTEM()

Effective JavaScript Item 55 接受配置对象作为函数参数

接受配置对象作为函数参数 虽然保持函数接受的参数的顺序很重要,但是当函数能够接受的参数达到一定数量时,也会让用户很头疼: var alert = new Alert(100, 75, 300, 200, "Error", message, "blue", "white", "black", "error", true); 随着函数的不断重构和进化,它能够接受的参数也许会越来越多,最终就像上面的例子那样. 对

Javascript - Jquery - 函数参数

函数参数(Parameter Mapping) 多参数 当一个函数具有多个参数时,如果我们在调用该函数时传递一大堆参数进去,而有些参数并不是必须的,代码看起来就有点混乱,此时可以使用匿名对象来解决.将参数作为匿名对象的属性,然后将匿名对象作为函数的参数即可. 参数替换 函数内部可以定义一个对象,设置对象的属性就是设置函数参数的默认值. function aa(options) { //配置默认参数 var param = { gender: 'man', age: 18 }; //extend方