CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

构造函数和对象

楼主eadi()2002-06-20 23:12:03 在 C/C++ / C语言 提问

书上说:创建无参对象时,如无无参构造函数,会出错。  
  但书上有这样的例程,不能理解,请诸位大哥指点  
  class   a  
  {  
      public:  
          A(int   aa=10,int   bb=1,int   cc=3)  
          {  
              ......    
            }  
      .  
      .  
      .  
      .  
      .  
      .  
  }  
  void   main()  
  {  
      A   a;     //不明白,这里创建的对象是无参对象吧?和他匹配的构造函数在那里? 问题点数:100、回复次数:21Top

1 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-06-20 23:13:58 得分 0

一般来说,现在的编译器都会自动给你生成一个无参的构造函数,也叫默认构造函数。Top

2 楼ckacka(/*小红帽*/ckacka();)回复于 2002-06-20 23:18:51 得分 0

你这样用的是默认的构造函数,这是不需要任何显式说明的,系统自动的!  
  如果你要调用参数的话,可以:  
              A   a(...)Top

3 楼eadi()回复于 2002-06-20 23:22:15 得分 0

我知道C++会提供默认的无参函数,但我这里定义了一个有参函数,C++就不会提供默认构造函数了,而我又没有定义无参构造函数,这个对象如何创建?Top

4 楼eadi()回复于 2002-06-20 23:25:46 得分 0

比如:  
  class   A  
  {  
        public:  
            A(int   n)     //没有无参构造函数  
            {  
                ......  
              }  
          .  
          .  
          .  
  }  
  void   main()  
  {  
        A   a;     //错误  
  Top

5 楼zhdleo(叮东)回复于 2002-06-20 23:27:56 得分 0

针对无参的对象,会自动生成一个A()的无参的构造函数,而且一般在你没有写的情况下,你要是声明一个无参的对象,系统会自动生成这个构造函数的。  
  构造函数可以有多个(不同类型的参数),析构函数只能有一个。  
   
  所以,我们可以写很多构造参数(不同类型的参数),只要你需要。  
  想特别有用的复制构造函数。  
   
  我的愚见!Top

6 楼eadi()回复于 2002-06-20 23:33:49 得分 0

但书上是这样说的:只要定义一个构造函数(不一定是无参构造函数),C++就不提供默认构造函数,如还想要无参构造函数,必须自己定义Top

7 楼Kaye(菜到几时)回复于 2002-06-20 23:38:54 得分 20

哦?有问题吗?  
  匹配的当然是A(int   aa=10,int   bb=1,int   cc=3)!  
  既然有默认参数,系统当然使用改构造函数了!Top

8 楼eadi()回复于 2002-06-20 23:46:11 得分 0

Kaye     我有点明白了,是不是因为参数有默认值,如果参数没有默认值就不行,是这样吗?Top

9 楼reaperGD(感悟者)回复于 2002-06-21 00:27:59 得分 0

记住上面一位兄弟说的话:  
   
  构造函数可以有多,析构函数只能有一个  
   
  根据参数的多少,系统自动选择调用哪个构造函数。Top

10 楼zhdleo(叮东)回复于 2002-06-21 00:29:01 得分 0

我怎么觉得还不对?  
  好像不是“没有默认值就不行“  
   
  你看在你声明的A(int   aa=10,int   bb=1,int   cc=3)  
   
  如果使用的时候,你传进来的是A(aa,bb,cc),就是说传进来的是参数,那么到了  
  这个构造函数里他们就被赋值为aa=10,bb=1,cc=3  
   
  如果你穿进来的本来就是个值A(1,2,3)  
  那么这时里面的aa=1,bb=2,cc=3   就是这样了!  
   
  这是另外一个问题。  
  所以你不能说“参数没有默认值就不行”  
  因为我们是可以这样定义的:A(int   aa,int   bb,int   cc)  
   
   
  说的不好,我的愚见!Top

11 楼eadi()回复于 2002-06-21 08:12:25 得分 0

叮东,如果这样定义:A(int   aa,int   bb,int   cc)//注意没有默认值,A   a,这样可以吗?创建对象该匹配哪个构造函数?照书上所说,对象没有可匹配的构造函数。因为没有无参构造函数,默认构造函数也由于已经定义了有参构造函数,而不会再由C++提供。我的理解是这样,请你指正。Top

12 楼T34(我是坦克我怕谁)回复于 2002-06-21 08:43:22 得分 30

<<C++   Programming   Language>>   10.4.2  
  A   default   constructor   is   a   constructor   that   can   be   called   without   supplying   an   argument.  
  A(int   aa=10,int   bb=1,int   cc=3)可以不接受参数,所以他就是默认构造函数,可以写A   a;Top

13 楼youngbamboo(youngbamboo)回复于 2002-06-21 09:17:19 得分 0

同意楼上的意见,A(int   aa=10,int   bb=1,int   cc=3)就是默认构造函数Top

14 楼LionEagle(LionEagle)回复于 2002-06-21 09:30:31 得分 50

to   T34(我是坦克我怕谁):  
   
  "A   default   constructor   is   a   constructor   that   can   be   called   without   supplying   an   argument."   是对的,  
   
  但并不意味着反过来说也对,即  
  "A   constructor   that   can   be   called   without   supplying   an   argument   MUST   be   default   constructor."   并不正确。  
   
  如果你为一个类写了constructor,那么编译器就不会产生default   constructor,本例中之所以可以   A   a,是因为每个参数都有缺省值  
   
  Top

15 楼anrxhzh(百宝箱)回复于 2002-06-21 09:39:37 得分 0

struct   test{  
  test(int){};  
  };  
   
  int   main()  
  {  
  test   t;   //error   C2512:   'test'   :   no   appropriate   default   constructor   available  
  }  
   
  Top

16 楼anrxhzh(百宝箱)回复于 2002-06-21 09:41:07 得分 0

struct   test{  
  test(int){};  
  };  
   
  int   main()  
  {  
  test   t;   //error   C2512:   'test'   :   no   appropriate   default   constructor   available  
  }  
   
  Top

17 楼beijingshizi(北京石子)回复于 2002-06-21 09:41:39 得分 0

如果没有构造函数,编译器会产生,如果有,就不会产生Top

18 楼yyzzbb_yang(eric)回复于 2002-06-21 10:00:25 得分 0

首先要告诉你,你调用的并不是无参constructor,而是默认参数的constructor。也不是你不能用无参构造函数,只要你没有声明任何constructor,编译器会为你产生一个缺省constructor,但是如果你定义了一个constructor,你就必须使用这种格式。当然你可以重载它,使它满足你的要求Top

19 楼eadi()回复于 2002-06-21 11:29:27 得分 0

谢谢诸位Top

20 楼eadi()回复于 2002-06-21 11:30:05 得分 0

谢谢诸位Top

21 楼LionEagle(LionEagle)回复于 2002-06-21 14:21:01 得分 0

更正一下:  
   
  没有参数的constructor是default   constructor  
  所有参数均有参数的constrcutor也是default   constructor  
  ;  
  如果一个类没有constructor(假设它为基类),则编译器就会为这个类合成一个default   constructor;  
  但如果它有constructor(无论它是否是default   construcotr),编译器就不会为这个类合成一个default   constructor。Top

22 楼LionEagle(LionEagle)回复于 2002-06-21 14:22:18 得分 0

更正一下:  
   
  没有参数的constructor是default   constructor  
  所有参数均有缺省值的constrcutor也是default   constructor;  
   
  如果一个类没有constructor(假设它为基类),则编译器就会为这个类合成一个default   constructor;  
  但如果它有constructor(无论它是否是default   constructor),编译器就不会为这个类合成一个default   constructor。Top

相关问题

  • 有关无名对象和拷贝构造函数的问题
  • 构造函数和析构函数
  • C++的基于对象的部分(构造函数,拷贝构造函数)
  • 使构造函数构造对象失败
  • 关于构造函数和拷贝构造函数的对比。
  • 构造函数和缺省构造函数????
  • 构造函数和拷贝构造函数
  • 构造函数
  • 构造函数
  • 构造函数??

关键词

  • c++
  • 函数
  • 编译器
  • 系统
  • 构造函数
  • 参数
  • constructor
  • 默认
  • 定义
  • 默认值

得分解答快速导航

  • 帖主:eadi
  • Kaye
  • T34
  • LionEagle

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo