先来了解默认参数是什么吧!
默认参数是指在定义或声明函数时,为参数指定默认值,在调用函数时,可以传递参数,也可以不传递参数;如果没有
传递参数,则在函数中使用默认参数的默认值!
对于默认参数不要单纯的错误的理解为就是函数的参数带有一个默认值,其实他强调的不仅是参数的默认的值还有如果
没有传递参数可以使用默认的参数;也就是说你调用函数时可以不带参数,却仍然能正常运行(这是用的就是默认参数的默
认值);因为编译器会自动调用默认参数
最典型的就是在带默认参数的构造函数:
比如说你定义了一个class A; A有两个private数据成员int a;和int b;如果不是用默认的构造函数的话代码如下:
A(); //不带参数的构造函数
A(inta,int b);//带参数的构造函数
如果你在新建对象时,如初始化
A a1; //初始化调用A();
A a2(3,4); //赋值调用A(int a,int b);
而如果使用带默认参数的构造函数时就不需要不带参数的构造函数了;如下:
A(int a=0,int b=0);
则不需要在写出不带参数的构造函数了;因为你如果这样定义对象:
A a1; //调用的还是A(inta=0,int b=0)因为编译器就不再产生默认的构造函数A();而是直接调用A(int a=0,int
b=0)
//因为没有实参的构造函数,是默认构造函数,参数指定了默认值的构造函数也是默认构造函数,一个类只能有一个默认构造函数
这里要说明的是一个类在写了默认构造函数之后就不会自动生成默认的构造函数,如果你写的是带默认参数的构造函数,则其实已经有了默认构造函数,如果在定义一个就会出现在A()就会出错了!看看下面的代码吧!
例如:
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
A()
A(){data2=0;data2=0;}
A(int a=0,int b=0){data1=a;data2=b;}
void display();
private:
int data1;
int data2;
};
void A::display()
{
cout<<data1<<endl;
cout<<data2<<endl;
}
void main()
{
A a1;
A a2(1,2);
a1.display();
a2.display();
}
编译后会出现错误是(用的VS2010)
C++1>f:\面向对象\miao_9\miao_9\12.cpp(8): error C2535: “A::A(void)”: 已经定义或声明成员函数
1>f:\面向对象\miao_9\miao_9\12.cpp(7) : 参见“A::A”的声明
1>f:\面向对象\miao_9\miao_9\12.cpp(14): warning C4520: “A”: 指定了多个默认构造函数
1>f:\面向对象\miao_9\miao_9\12.cpp(22): error C2668: “A::A”: 对重载函数的调用不明确
1>f:\面向对象\miao_9\miao_9\12.cpp(9): 可能是“A::A(int,int)”
1>f:\面向对象\miao_9\miao_9\12.cpp(7): 或 “A::A(void)”
现在解释下上面的错误出现的原因吧:首先要说的就是“指定了多个默认构造函数”
A()
A(){data2=0;data2=0;}
如上所说的这两个都是默认构造函数,而一个类只能调用一个默认构造函数(一定要注意带默认参数的构造函数也是默认构造函数!)
在就是
对重载函数的调用不明确
也就是所说的二义性啊,因为编译器不知道调用哪个默认的构造函数啊!
A a1;
创建这个对象时调用默认构造函数时,两个默认构造函数都符合,所以编译器不知道调用哪个!只需要把A()删掉那么两个问题就都解决了。
现在在举个函数重载时二义性例子:
#include<iostream>
using namespace std;
int max(int a,int b);
int max(int a=0,int b=0,int c=0); //函数重载
void main()
{
inta=2;
intb=3;
cout<<max(a,b)<<endl;
}
int max(int a,int b)
{
if(a>b)
returna;
else
returnb;
}
编译后报错如下(VS2010):
C++1> 正在创建“Debug\miao_12.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1> 2.cpp
1>f:\面向对象\miao_12\miao_12\2.cpp(9): error C2668: “max”: 对重载函数的调用不明确
1> f:\面向对象\miao_12\miao_12\2.cpp(4): 可能是“int max(int,int,int)”
1> f:\面向对象\miao_12\miao_12\2.cpp(3): 或 “int max(int,int)”
1> f:\visualstudio\vc\include\xutility(2078): 或 “const
_Ty &std::max<int>(const _Ty&,const _Ty &)”
1> with
“函数重载调用不明确”也就是在调用max(a,b)时两个
int max(int a,int b);
int max(int a=0,int b=0,int c=0); //函数重载
在语法上调用都是合法的,所以才会出现调用不明确啊,对于int max(int a,int b)无可非议,调用他是合法的。而对于int max(int a=0,int b=0,int c=0)也是符合语法的,这就是C++的默认参数效果,因为C++对于使用默认参数的函数是不一定传递函数的参数,也就是说参数是可以省略的!至于怎么改就不在赘述了,,,,
说道这里,应该差不多了吧!呵呵,,还是那句老话,对于有不对之处,还望指出!
参考书目《面向对象程序设计(C++版)》
分享到:
相关推荐
用C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。
為 CSDN-CSDN社区-C/C++-新手乐园 的朋友所回答的第二問題。
c/c++-mfc编程实例教程
為 CSDN-CSDN社区-C/C++-新手乐园 的朋友所回答的問題。
C语言/C++集成开发环境 Dev-C++。一款优秀的C/C++集成开发软件。
大一学期作业C语言-数据结构开发非常简单的图书管理系统,可以帮助学习单链表操作。 分为: C版本---DevC++打开 C++版本-----VS打开 主页面如下: 欢迎使用图书管理系统(管理员:admin 密码:password) 1.管理...
Dev-cpp5.4.0及API帮助文档 2018年蓝桥杯C语言/c++ 需要的同学可以下载使用
关于C语言的算法问题-迭代法,穷举搜索法,递推法等
C#深入浅出全接触 .rar http://down.qiannao.com/space/file/yuexingchen2/-4e0a-4f20-5206-4eab/C-002b-002b-0020-0020-00b7C-0020-0020vc/C-0023-6df1-5165-6d45-51fa-5168-63a5-89e6-0020.rar/.page C#知识类库 ....
资源是笔者在MATLAB里面安装的MinGW-w64 C/C++编译器安装包,主要用于作为博文https://blog.csdn.net/jiqiren_dasheng/article/details/103759720的资源附件。(声明:上传时积分设置的1,如果数值后续变了,就是...
Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW中的GCC编译器、GDB调试器和 AStyle格式整理器等众多自由软件...
* 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试 * 1、将fis.c文件拷贝到项目中; * 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加 ...
蓝桥杯C/C++2013-2018预赛省赛真题,包含C/C++、JAVA。
C/C++代码检查工具pc-lint中文使用说明
附件资源下载源位置 https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler,按照官网介绍,仅适用于...未找到支持的编译器或SDK,MinGW-w64 C/C++编译器在线安装
工作原因c和java都得熟悉,因此把java端和c/c++实现都给大家了,注意java端要明确指明字符集为GBK,因为各版本jdk默认字符集并不一致,key采用16位,你知道的。压缩包里有两个工程,一个vc6.0一个myeclipse,本帖是...
二、Pro*C/C++ GCC 环境配置 3 2.1、Pro*C/C++ 预编译环境 3 2.2、GCC 编译器 5 三、开始编写第一个Pro*C++代码 5 3.1、第一个Pro*C++代码 5 3.2、Pro*C++代码预编译 6 3.3、GCC 编译 7 3.4、最后测试 8 四、复杂...
C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码 C语言/C++ 烟花表白代码
C-Free是一款支持多种编译器的专业化C/C++集成开发环境(IDE)。利用本软件,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。C-Free中集成了C/C++代码解析器,能够实时解析代码,并且在编写的过程中给出...
#二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...