posts - 134,comments - 22,trackbacks - 0
一个继承类的构造函数首先要调用基类的构造函数。这没有什么需要说明的。
本文要说的是当调用本类自己的构造函数时,将会产生什么行为。
       通常情况下,我们只通过new或继承来调用一个类的构造函数,因为我们在类函数列表中看不到构造函数,然而在类函数中,是可以调用构造函数的。假设我们有构造函数A和构造函数B,那么在A中调用B就是一个很自然的想法。
       但是请注意:这种写法不会达到你期望的效果(无非是偷懒喽),而且会使你的程序出现意想不到的错误。:(
       请看下面一个例子:
// 研究观察C++一种有意思的构造析构函数调用现象

// 现象
// 在构造函数A中调用重载的构造函数B
// 结论
// 在B被调用结束(A未结束)时已经有一次析构函数被调用

// 测试平台
// 1.Win2K + VC6
// 2.Linux + gcc


#include <stdio.h>

class CTest
{
public:
   CTest() {
     CTest(0);
    //已经调用析构函数
     printf("CTest()\r\n");
   }
CTest(int i) {
     CTest(i, 0);
    //已经调用析构函数
     printf("CTest(%d)\r\n", i);
}
CTest(int i, int j) {
       printf("CTest(%d, %d)\r\n", i, j);
}
virtual ~CTest(){
      m_CTestCount++;
      printf(" ~CTest() m_CTestCount = %d\r\n", m_CTestCount);
}
static int m_CTestCount;
};
int CTest::m_CTestCount = 0;
int main()
{
CTest cT;
printf("main()\r\n");
//调用析构函数
return 0;
}

/*
//程序运行输出
CTest(0, 0)
~CTest() m_CTestCount = 1
CTest(0)
~CTest() m_CTestCount = 2
CTest()
main()
~CTest() m_CTestCount = 3
//程序运行输出
*/

=======================================
出现这种结果的原因是什么呢?
       当直接调用类的构造函数时,将产生一个A类型的临时对象,然后又马上被销毁。
       所以当在构造函数A中调用构造函数B时,也不会对本类的类变量进行初始化,导致的结果就是,构造函数A调用了B之后,本类的类变量还是没有被初始化,当A继续对这些类变量进行操作时,将出现对未初始化的空间进行访问的错误。

=======================================
直接调用构造函数有没有用呢?
        既然直接调用可以产生一个临时对象,然后又马上被销毁。那么我们就可以把这种特点用于传参。
        class A 有一个构造函数 A(int x)     
        void foo(A a);
        就可以 foo(A(10));
        此外对于 vector ve; ve.push_back(A(10)); 等容器操作也是有用的。

posted on 2009-12-12 14:45 何克勤 阅读(937) 评论(0)  编辑  收藏 所属分类: C/C++

只有注册用户登录后才能发表评论。


网站导航: