`
lovnet
  • 浏览: 6723380 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++默认参数注意事项

 
阅读更多

默认参数在函数参数较多时是非常有用的.可以只传必须的值,其它取默认值.使用方法如下:

1.默认参数是严格按照从左至右的顺序使用

所以只有如下使用才是合法的

(1)参数全部为默认值. void Fun( int a = 1, int b = 2, int c = 3)

(2)void Fun(int a , int b = 2, int c = 3)

(3)void Fun(int a , int b = 2, int c) //这样是错误的,如果从某处开始使用默认值,则右边所有其他参数也必须有默认值

调用函数的时候传进去的实参个数必须大于或等于无默认值的形参个数.然后匹配参数的时候是从左至右去匹配.不过这样会存在一些问题.

例如

void Fun( int one , int two = 2, int three = 3);

当调用时如果用户想只传两个参数提供one和three的值是做不到的,因为必须从左至右严格匹配,所有要想传值给three,就必须给它前面的所有参数也传值.

自然也有人想到了这问题,于是建议C++之父stroustrup增加一个特性,可以显式指定给第几个参数赋值.比如调用上面函数时可以这样Fun(one = 1 ,three = 3),甚至还可以不按顺序

Fun(three = 3, one = 1)这样用户可以随意指定要赋值给哪个参数,当然没有默认值的参数肯定是要保证都有赋值的. 在PL/SQL中的函数调用就完全体现了这种思想.

不过stroustrup觉得这样做带来的好处不是太大,而且有些弊端,于是就没有在C++中添加这特性.比较容易想到的弊端就是由于函数声明和定义中的形参名字是可以不一样的.这样就一来靠形参名字来显式指定传的实参就比较麻烦了.例如声明是void Fun(int one , int two);但定义变成了void Fun(int two, int one) { }

2.参数默认值只能在声明或定义中一处指定.不能同时指定.

例如有类Arwen,然后在头文件中声明函数FunDefault.然后cpp文件中定义.可以用如下两种方式

方法(1)

int FunDefault( int one , int two = 123); //声明

int Arwen::FunDefault(int one , int two) //定义

{

//....

}

方法(2)

int FunDefault( int one , int two );

int Arwen::FunDefault(int one , int two =123)

{

//....

}

但如下是错误的

方法(3)

int FunDefault( int one , int two = 123);

int Arwen::FunDefault(int one , int two = 123)

{

//....

}

实际上按道理讲方法(3)是最直观,最易理解的.但可能考虑到一来嘛两个地方都重复赋值下有点麻烦,二来编译器还要去做判断保证两个默认值要一致,所以就干脆不让这样做了.

3.默认参数与函数重载的二义性问题.

假如有函数

void Fun(int one, int two = 2);

void Fun(int one);

当这样调用时Fun(1);上面两个函数都是完全匹配的.所以就有二义性了,编译的时候会报错的.

不过有点奇怪的是只要你是同时有函数声明和定义时才会报错.如果声明和定义是在一起,都在头文件中,也就是内联函数(inline)时,上面这样使用不会报错.Fun(1)调用的是void Fun(int one ,int two = 2); 我是在VS中试的,不知道其他编译器是否做同样的处理

当然了最好我们在代码中避免出现这样的情况.实际上很多时候默认参数就是用来替代函数重载(就像上面的两函数,当一个函数只是比另外一个函数的参数个数多,其他参数相同).所以设计良好的代码应该是没有必要同时存在这样的默认参数与重载函数的

分享到:
评论

相关推荐

    C++默认参数与函数重载及注意事项

    一、默认参数 在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。 默认参数的语法与使用: ...(#add 这是定义时,类的成员函数的参数表在声明时默认参数位于参数

    C++中函数的默认参数详细解析

    注意事项:(1)一般在声明函数是设置默认参数。 如果在函数声明和定义函数时都设置了默认参数,则以函数声明的默认参数为准。 代码如下:#include<iostream>using namespace std;int main(){ double add(double a=...

    探讨:C++中函数返回引用的注意事项

    以下是几种引用情况:1,引用函数的参数,当然该参数也是一个引用 代码如下:const string &shorterString(const string &s1,const string &s2) { return s1.size()<s2.size()?s1:s2; }以上函数的返回值是引用...

    Visual C++开发经验技巧宝典(第1章)

    0010 函数exit的注意事项 5 0011 调试无限循环 5 0012 控制台输入/输出 5 0013 delete与delete []的差别 6 0014 符号#、##、#@的用法 6 0015 将某个地址转换为指针 6 0016 常用内存分配及释放函数 6 ...

    Effective C++

    Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个细节问题,书中的每一条准则描述了一个编写出更好的C++的方式,每一个条款的背后都有具体范例支持,书中讲的都是C++的编程技巧和注意事项,很多都...

    C_C++问题总结

    1.1.3 修饰函数参数与返回值 1.1.4 类中的应用 1.2 static 1.3 volatile 1.4 extern 2. 函数 2.1 sizeof与strlen区别 2.2 strcpy、sprintf与memcpy 2.3 new/delete 与 malloc/free 2.4 确定一个数转化成二进制后是1...

    C++期末考试复习资料

    简单的介绍了考试的主要内容和注意事项 1。static 的含义 2。理解:函数的定义,函数的调用,函数的参数传递 理解:内联函数 理解:带默认形式参数值的函数

    C++ 核心编程 学习笔记

    引用的基本使用,引用注意事项,引用做函数参数,引用做函数返回值,引用的本质,常量引用 函数提高: 函数默认参数,函数占位参数,函数重载 类和对象: 封装,对象的初始化和清理,C++对象模型和this指针,友元...

    C++核心编程.md

    内存分区模型 程序运行前 程序运行后 new操作符 引用 引用的基本使用 引用注意事项 引用做函数参数 引用做函数返回值 引用的本质 常量引用 函数提高 类和对象 文件操作

    深度探究C++中的函数重载的用法

    C++ 允许同一范围内具有相同名称的多个函数的规范。这些函数称为重载函数,“重载”中对其...重载注意事项 函数声明元素 是否用于重载? 函数返回类型 No 参数的数量 是 参数的类型 是 省略号存在或缺失 是

    经典C/C++面试题目大汇总(全附答案).doc

    注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题。 第一篇 求职 第1章 应聘求职 1.1 企业与人才 1.1.1 企业需要...

    <WINDOWS API函数参考手册>

    书中详细介绍了每一个Win32 API函数的使用方法,其中着重介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数《Windows API函数参考手册》给出了相应的...

    禁忌搜索算法30城市TSP问题(C++源代码)

    此代码是我智能计算课的一个练习...源代码是一并上传了的,其中每一个函数的功能都有详细标注,基本上每一个关键的程序位置都有说明原因及注意事项,代码的可读性是非常强的,也非常方便朋友们根据自己的需要要求更改。

    英伟达CUDA C/C++加速和优化N体模拟器认证通过代码01-nbody.cu

    做此练习时可考虑的注意事项 在开始任务之前,请注意以下事项: 在第一次重构中,请格外注意应用程序的逻辑部分(尤其是 bodyForce 函数)能够并且应该基本保持不变:要侧重于尽可能轻松地加速应用程序。 代码库包含...

    老生常谈C++中实参形参的传递问题

    还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项: 1.非引用形参 这是最普通,也是最简单的形参传递了。 参数传递,即是使用实参副本(注意啊,是副本,不是实参本身)来初始化形参; 因此,在...

    Visual C++音频视频处理技术及工程实践(分卷7)

    本书共16章,分为4篇,详细讲解了...附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共11个分卷。

    Visual C++/Turbo C串口通信编程实践 及源代码-1

    11.4 串口调试注意事项 318 11.5 常用数据校验法 318 11.5.1 奇偶校验 318 11.5.2 循环冗余码校验 319 11.6 串口连接和tcp/ip连接对比 320 11.7 现场总线与rs-232、rs-485的本质区别 320 11.8 modem通信技术 ...

    Visual C++音频/视频处理技术及工程实践 (分卷1)

    本书共16章,分为4篇,详细讲解了使用...附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷

Global site tag (gtag.js) - Google Analytics