免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2417 | 回复: 10
打印 上一主题 下一主题

关于构造函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-01 02:31 |只看该作者 |倒序浏览
12 class CLS
13 {
14 public:
15     int m_I ;
16     CLS(int i) : m_I(i) {}
17     CLS()
18     {
19         CLS(0) ;
20     }
21 } ;
22
23 int main()
24 {
25     CLS obj ;
26     cout << obj.m_I<< endl ;
27     return 0 ;
28 }

问题:
        1> 以上代码执行结果为什么不是0?
        2> 构造函数只调用了一次? 第19行的构造函数被系统忽略了?

论坛徽章:
0
2 [报告]
发表于 2007-11-01 02:47 |只看该作者
12 class CLS
13 {
14 public:
15     int m_I ;
16     CLS(int i) : m_I(i) {}
17     CLS()
18     {
19         CLS(0) ;
20     }
21 } ;
22
23 int main()
24 {
25     CLS obj ;
26     cout << obj.m_I<< endl ;
27     return 0 ;
28 }

问题:
        1> 以上代码执行结果为什么不是0?
        2> 构造函数只调用了一次? 第19行的构造函数被系统忽略了?

1. 构造函数调用了两次, 一次是CLS(), 一次是CLS(0), 每次调用都创建了不同的CLS对象;
2. CLS obj 调用的是CLS(), m_I没有被初始化, 在CLS()内调用的CLS(0)创建的是另一个对象,这个对象的m_I初始化为0。
3. 如果你加上~CLS(){COUT << "DECONSTRUCT CLS"<< ENDL;}, 运行后,就更明白了。

论坛徽章:
0
3 [报告]
发表于 2007-11-01 10:04 |只看该作者
对c++不懂,弱弱di问一句, CLS obj 这样构造出来的应该叫做实例(Instance) 而不是对象(Object) 吧?
忘记谁和我说过的一句话“C++中,对象都是 new 出来的”

论坛徽章:
0
4 [报告]
发表于 2007-11-01 14:17 |只看该作者
17     CLS()
18     {
19         CLS(0) ;
20     }

如果你想实现这样的功能,我想你可以使用给i提供默认值得方式。

论坛徽章:
0
5 [报告]
发表于 2007-11-01 14:45 |只看该作者
对象就是系统分配了内存,有存储空间而已.
不一定要new吧.

论坛徽章:
0
6 [报告]
发表于 2007-11-01 15:00 |只看该作者
CLS(0) ;

这个地方生成一个临时对象罢了.

论坛徽章:
0
7 [报告]
发表于 2007-11-01 16:12 |只看该作者
12 class CLS
13 {
14 public:
15     int m_I ;                              //定义了一个变量
16     CLS(int i) : m_I(i) {}          //带参数构造器
17     CLS()                                 //默认构造器。
18     {                                      // C++程序员不会像下面这样调用的,即使是“调用”父类构造器
19         CLS(0) ;                        //该行代码其实是申请了一个新的对象,但是该对象句柄没有被任何调用者所访问,完全是脱了裤子放屁,即使被谁获得这个对象,也没有实际意义。
20     }                                     //该该构造器不会初始化任何值
21 } ;
22
23 int main()
24 {
25     CLS obj ;                         //调用默认的无参构造器
26     cout << obj.m_I<< endl ;   //输出的值是一个没有初始化的值。不知道可能是什么
27     return 0 ;
28 }

论坛徽章:
0
8 [报告]
发表于 2007-11-01 16:22 |只看该作者
那么, java里

class CLS{
     private int i = 0;
     
     public CLS(int i){this.i = i;}
     public CLS(){this(0);}
}

C++里边有对应的写法么?就是调用在一个构造函数里调用另外一个重载的构造函数

论坛徽章:
0
9 [报告]
发表于 2007-11-02 13:15 |只看该作者
to 8楼:
为什么不写用一个初始化的函数被不同构造器调用呢?

论坛徽章:
0
10 [报告]
发表于 2007-11-02 13:27 |只看该作者
原帖由 caualex 于 2007-11-1 00:22 发表
那么, java里

class CLS{
     private int i = 0;
     
     public CLS(int i){this.i = i;}
     public CLS(){this(0);}
}

C++里边有对应的写法么?就是调用在一个构造函数里调用另外一个重载 ...


要不这样?呵呵:

  1. class CLS {
  2. public:
  3.   CLS(int x) : x_(x) {}
  4.   CLS() { new (this) CLS(0); }
  5.   int x() const { return x_; }
  6. private:
  7.   int x_;
  8. };
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP