【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】

前言

当debug时遇到这个错误C2572: “XXXX”: 重定义默认参数,往往是因为在函数的声明和定义中同时给参数设定了默认值。想修改这个错误,你只需将函数的定义中的形参默认值部分删除即可。(注:不是删除形参,而是删除默认值部分)例如以下这种情况,编译器就会报错;

Student(int a , char *n = "default name");    //函数声明
Student::Student(int a, char *n = "default name" )    //函数定义
{ /*函数实现*/
}

修改后的代码如下;这样程序就能正常运行了。

Student(int a , char *n = "default name");    //函数声明
Student::Student(int a, char *n  )    //函数定义
{ /*函数实现*/
}

问题分析

这个错误并不是什么大问题,因为在写代码的过程中,为了省事,大家都会习惯性的把函数的声明直接粘贴到函数的定义处。至于说为什么不能在函数的声明和定义处同时给形参以默认值,我查阅了一些书籍都没有给出明确的解释。大家只需记住即可。(OS:这根本就不算分析好吗?)

我又好奇的想了一下,能不能在函数的声明中不给予形参默认值,而在定义中给予默认值呢?所以我又试了一下。测试是在VS2013下进行的。测试结果是也可以运行。但是我又在另一种情况下进行了测试,发现无法运行。下面这种情况中就不可以,因为main() 函数调用func() 函数时,根据函数声明,形参并没有默认值,所以调用函数时,不能使用缺省的参数值。

int func(int a);void main()
{int aa = func(5);int bb = func();    //报错cout << aa<<" ";cout << bb;system("pause");return;
}int func(int a=3 )
{a += a;return a;
}

引申

再引申一下,在类中,如果你想定义一个构造函数,并且将某一构造函数中的所有形参都设定默认值,这样做会发生什么呢?

Student(){ age = 20; name = "default name"; }  //不带形参的默认构造函数
Student(int a = 20, char *n = "default name"); //形参有默认值的默认构造函数

答案是你使他变成了一个默认构造函数;

Student NI;   //报错,定义了多个默认构造函数

为什么会变成默认构造函数呢?我们来看看上面的报错:因为NI这个对象时没有给定初始化参数,所以应该调用没有参数的构造函数,也就是默认构造函数。而在第二个构造函数中所有的参数都有默认值,所以NI也能调用他,所以其实他也是默认构造函数,只是说这个默认构造函数也可以初始化带数据的对象。这就是为什么这两种方式都是定义的默认构造函数的原因。

所以在C++中有两种方式的默认构造函数

1)定义一个无参数的构造函数;

2)定义所有参数都有默认值得构造函数。

今天根据一个问题,举一反三,又复习了其他两个内容。。

已完。。

【C++】 error C2572: 重定义默认参数相关推荐

  1. Python之定义默认参数

    定义函数的时候,还可以有默认参数. 例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数: >>> int('123') 123 > ...

  2. 【C++笔记】函数的用法:函数的默认参数、占位参数、函数重载

    函数的默认参数 在C++中,函数的形参列表中的形参是可以有默认值的. 语法:返回值类型 函数名 (参数=默认值){} int func(int a, int b = 20, int c = 30){r ...

  3. 【C++ grammar】重载、内联、变量作用域、带默认参数的函数

    目录 1.变量的作用域 1. 变量的作用域分类 2. Unary Scope Resolution (一元作用域解析运算符) 2.重载函数 3.带有默认参数值的函数 4.重载函数 VS 带有默认参数值 ...

  4. c++函数的默认参数在哪里定义?

    答:函数原型声明里和函数定义中都行.但是必须满足两个规则: 1.只能在函数声明和函数定义中选一个,不能两个都定义默认参数. 2.默认参数无论定义在函数声明还是函数定义中,必须位于调用该函数的函数前面. ...

  5. 申明(声明)、定义及默认参数

    变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定bai义. 变量声明:用于向程序表明变量的类型和名字. 区别: 定义也是声明,extern声明不是定义.定义分配存储空 ...

  6. Python基础教程:默认参数和可变参数

    1. 默认参数 在函数定义时附加一个赋值运算符(=)来为参数指定默认参数值.必选参数在前,默认参数在后,匹配时从左往右进行匹配. 使用默认参数有什么好处?最大的好处是能降低调用函数的难度. def e ...

  7. python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不 ...

  8. python可变参数和关键字参数位置_python笔记——函数的参数(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合)...

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  9. python函数可以按照参数名称方式传递参数_python函数传入参数(默认参数、可变长度参数、关键字参数)...

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1):2 printa,b3 4 foo(2) #2 1 5 foo(3,100) ...

最新文章

  1. 迷宫问题输出超限反思
  2. 京东数科首次公开:强一致、高性能分布式事务中间件JDTX
  3. acwing算法题--多重背包问题一
  4. layui 给table里面的添加图标_layui中的table中toolbar自定义过程
  5. 抢红包神器上线,再也不怕抢不到红包了!
  6. Apache Velocity官方指南-资源
  7. 北大“四大疯人院”之说
  8. pb 打印html页面,用PB开发WEB应用
  9. android paint 线宽_Paint setStrokeWidth方法:设置空心线宽
  10. 决策树人工智能预测模型_部署和服务AI模型进行预测的10种方法
  11. TextMeshPro备用字体疑问
  12. java根据word模板生成word文档_根据Word模板生成Word文件 (JAVA POI)
  13. matlab gui 简介,Matlab中Powergui的介绍.pdf
  14. 一起学爬虫(Python) — 19 年轻人,进来学自动化
  15. 复旦大学计算机a类专业,复旦大学a类学科有哪些?附复旦a类学科名单
  16. 0. DRF之软件开发模式CBV源码解析
  17. 输入90输公因数java_关于Java中的几个数论中的知识
  18. 如何使用IP地址链接数据库
  19. 我有一个网络工程师的梦
  20. BloomFilter布隆过滤器

热门文章

  1. 卸载Oracle数据库(有图有真相)
  2. 在Oracle DG Standby库上启用flashback database功能
  3. TiDB备份恢复方式你知多少?
  4. 面试官系统精讲Java源码及大厂真题 - 26 惊叹面试官:由浅入深手写队列
  5. java 从键盘中读取字符流 自定义异常
  6. 【Linux】安装x11vnc和xrdp,使用windows远程deepin
  7. 【Java】编写Java程序,完成从键盘输入两个运算数据,计算两数之和并输出结果...
  8. chrome和safari_私人浏览器-如何在Chrome和Safari中使用隐身模式
  9. ruby 新建对象_Ruby面向对象编程简介
  10. windows下安装mongodb服务