关于默认构造函数和含默认参数为0的构造函数的区别?新手求教

perfect_blue 2016-04-13 06:11:01
问题是这样的:上课的时候老师在用DevC++编一个新代码介绍多态(这不重要),写的是类,然后他直接开始写成员函数(总的来说它没有写析构和默认构造函数),
然后自定义了一个构造函数比如time(int hour,int minute,int second)然后他在int main()中定义time s1的时候,报错
说没定义默认构造函数,然后他就把上面的参数改成int hour=0,int minute=0,int second=0;然后这个问题就解决了。然后叫同学打的时候,同学写了个默认的time(){}和time(int hour=0,int minute=0,int second=0)然后就报错了。。。。
我的问题是:老师改过之后跟原来的有是什么区别,还有此时老师依旧没有定义默认构造函数是么?那加了个什么都不做的默认构造函数后为什么就错了?(我所知道的知识:自定义构造函数时,系统不会帮你定义默认构造函数。。。这个应该是对的吧)
求解。。。。
...全文
527 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-14
  • 打赏
  • 举报
回复
凡是有默认操作的流程,在带来方便的同时,也带来了困扰。
小灸舞 2016-04-14
  • 打赏
  • 举报
回复
引用 6 楼 qq_34506038 的回复:
[quote=引用 3 楼 qq423399099 的回复:] 1.对的,只要你自己写出了带参的构造函数,那么,那个原本可以由编译器自动创建的无参构造函数(默认构造函数)就永远的消失了; 2.什么叫参数多出一个天数?都是默认值的构造函数也不能完全替代,比如你想只传minute这个参数,那这个构造函数就办不到了,需要另外写一个重载的构造函数
这是时间类,目前只有时分秒的三个参数,我说多个天数作为参数的话以你的意思就是要另外写一个 time(int day=0,int hour=0,int minute=0,int second=0)是吧。 另外,这样写的话那么比如建立time对象数组的时候,time test【10】,这十个对象的每个对象的四个参数都是0是吧。[/quote] 对的
列子汤问 2016-04-14
  • 打赏
  • 举报
回复
要分清楚默认参数的构造函数和默认的没有参数的构造函数 如果: 仅仅写了time(int hour=0,int minute=0,int second=0),那么time s1的意思就是 s1(0,0,0) 但是如果同时写了time(int hour=0,int minute=0,int second=0)和time(), 那么对于time s1,系统就不知道是s1(0,0,0)还是 s1()了。 所以就报错了。
solure 2016-04-13
  • 打赏
  • 举报
回复
用默认参数的构造函数你可以指定默认初始化状态,而默认的构造函数你不知道它是怎么给你初始化成员的,其实默认构造函数和默认参数的构造函数是可以共存的,只要不产生歧义,比如time(){}和time(int hour,int minute=0,int second=0){},当你声明变量time t时只会调用默认构造函数,要使用后面那个构造函数你还得给他传递至少一个参数,因为hour没有默认值
stephen_csdn 2016-04-13
  • 打赏
  • 举报
回复
默认是指你没定义构造函数的前提下; time s1;报错是因为没有无参构造函数,加了默认参数以后,满足了无参构造条件
perfect_blue 2016-04-13
  • 打赏
  • 举报
回复
引用 3 楼 qq423399099 的回复:
1.对的,只要你自己写出了带参的构造函数,那么,那个原本可以由编译器自动创建的无参构造函数(默认构造函数)就永远的消失了; 2.什么叫参数多出一个天数?都是默认值的构造函数也不能完全替代,比如你想只传minute这个参数,那这个构造函数就办不到了,需要另外写一个重载的构造函数
这是时间类,目前只有时分秒的三个参数,我说多个天数作为参数的话以你的意思就是要另外写一个 time(int day=0,int hour=0,int minute=0,int second=0)是吧。 另外,这样写的话那么比如建立time对象数组的时候,time test【10】,这十个对象的每个对象的四个参数都是0是吧。
knifekaka 2016-04-13
  • 打赏
  • 举报
回复
A(int i = 0, int j = 0) { std::cout << "调用成功" << std;:endl; } int main() { A(); // 输出 "调用成功" A(1); // 输出 "调用成功" A(1, 2) // 输出 "调用成功" // 看到这里你是不是有点概念了? // 假设A是B的构造函数, 编译的时候编译器会生成无参数的构造函数。就这么简单。 return 0; }
D41D8CD98F 2016-04-13
  • 打赏
  • 举报
回复
A default constructor for a class X is a constructor of class X that either has no parameters or else each parameter that is not a function parameter pack has a default argument.
小灸舞 2016-04-13
  • 打赏
  • 举报
回复
1.对的,只要你自己写出了带参的构造函数,那么,那个原本可以由编译器自动创建的无参构造函数(默认构造函数)就永远的消失了; 2.什么叫参数多出一个天数?都是默认值的构造函数也不能完全替代,比如你想只传minute这个参数,那这个构造函数就办不到了,需要另外写一个重载的构造函数
perfect_blue 2016-04-13
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
如果类中声明了构造函数,那么系统不再提供默认构造函数,此时用户如果还要使用无参构造函数,则需要自己重载构造函数。 这要分情况,如果说你要创建无参数的对象时,就不可以共存,因为编译器就会不知道要调用那个构造函数而出错。而当你创建有参数的对象时,就可以。 一般情况下,一个类中有一个全部都是默认参数的构造函数就够了,因为它相当于重载了所有的构造函数。
也就是说这里的time(int hour=0,int minute=0,int second=0)承担了默认构造函数的功能是么?无参构造函数和默认参数的构造函数具体有什么区别么? “一个类中有一个全部都是默认参数的构造函数就够了,因为它相当于重载了所有的构造函数。”是指无论有几个参数刚刚的代码都可以当作默认构造函数是么?比如参数多出一个天数,但我没写对应的构造函数,能用么?
小灸舞 2016-04-13
  • 打赏
  • 举报
回复
如果类中声明了构造函数,那么系统不再提供默认构造函数,此时用户如果还要使用无参构造函数,则需要自己重载构造函数。 这要分情况,如果说你要创建无参数的对象时,就不可以共存,因为编译器就会不知道要调用那个构造函数而出错。而当你创建有参数的对象时,就可以。 一般情况下,一个类中有一个全部都是默认参数的构造函数就够了,因为它相当于重载了所有的构造函数。

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧