Panic的小屋

国破山河在,城春草木深。
随笔 - 151, 评论 - 1317, 引用 - 22, 文章 - 0

导航

公告

<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(269)

随笔分类

随笔档案

文章档案

相册

国外好站推荐

工具网页

我的其他网页

我的网友

户外运动

美女的空间

搜索

最新评论

阅读排行榜

评论排行榜

在构造函数中调用构造函数

Posted on 2005-06-09 21:19 Panic 阅读(6050) 评论(5)  编辑 收藏

在构造函数中调用构造函数

作者:panic 2005年6月9日

源自VCKBASE的一个帖子。
首先明确一点:直接调用构造函数,只有一个作用,就是在栈上构造一个临时对象。
所以构造函数的互相调用引起的后果不是死循环,而是栈溢出。

理论上,不允许在某个构造函数中调用其他构造函数。除非有特别的功能需求。

假设一个类
class A
{
public:
    A();
    A(int i);
    ~A();
}

假设实现是这样的:
A::A()
{
    A(0); //注意
}

A::A(int i)
{
}

A::~A()
{
}

在 //注意 处的代码,其实执行了这样的操作:
在栈上开辟空间,构造一个A的实例。
然后对象被释放,这个释放有可能在函数结束前就进行了。

最终跟踪到的结果是这样:
A()被调用
A(int i)被调用
~A()被调用
//.....

上面那个~A()让很多人迷惑,其实这只是那个临时对象释放而已。

这个临时对象,在大多数场合不产生任何有功能的影响力。

这种调用,往往被很多人误解,以为可以通过构造函数的重载和相互调用实现一些类似默认参数的功能,其实是不行的,而且往往有副作用。

而同一个类的构造函数又不能写在初始化成员列表里面,那怎么样才能实现这种需求呢?

偶只知道一个方法:
额外增加一个Init函数,在不同的构造函数中用不同的参数调用这个函数即可。

虽然不够优雅,但是勉强够用了。

 

Feedback

# 回去想了一下,差不多明白了,不过还是恐慌兄快呀,;P

2005-06-10 09:16 by 笑柄
A::A()
{
    A(0); //注意
   //这个地方构造了一个对象,由于没有人接收该对象,即该对象为该函数的局部变量,则离开该函数域则销毁,故析构是必然的
}

# LOOK THIS!!!use placehold constructor

2005-06-10 11:00 by X
class A
{
public:
A();
A(int i);
~A();
}


A::A()
{
new(this)A(0);
}

A::A(int i)
{
}

A::~A()
{
}

# another way is ->

2005-06-10 11:06 by E
A::A()
{
*this=A(0);
}

but not efficiency

referring to :
http://blog.vckbase.com/bastet/archive/2005/03/03/3370.html

# 成员初始化列表

2005-06-11 21:14 by 清风雨
如题!

这个是C++,不是java,所以C++兄弟要小心一点。(开始自己也以为类似,可以的)

# re: 在构造函数中调用构造函数

2008-10-27 23:27 by hc
很大程度上是语法问题
A::A()
{
    A(0); //注意
}
在构造函数中A(0)是一个临时对象,要调用其他的构造函数应使用显示调用法A::A(0)

顺便说句:在构造函数中调用虚函数是不会有多态性的。
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]