首页 > 代码库 > 【转】 C++中如何在一个构造函数中调用另一个构造函数

【转】 C++中如何在一个构造函数中调用另一个构造函数

在C++中,一个类的构造函数没法直接调用另一个构造函数,比如:

 1     #ifndef _A_H_ 2     #define _A_H_ 3     #include <stdio.h> 4     #include <new> 5     class A 6     { 7     public: 8             A() 9             {10                     printf("In A::(). m_x=%d\n", m_x);11                     A(0);12                     printf("Out A::(). m_x=%d\n", m_x);13 14             }15 16 17             A(int x)18             {19                     printf("In A::(int x). x=%d\n", x);20                     m_x=x;21             }22 23     private:24             int m_x;25     };

这里第11行的调用A(0);只是构建了一个A的临时对象,并没有调用A(int x)来初始化自己。其运行结果是:

 

[root@tivu25 utcov]# ./UTest.outIn A::(). m_x=4268020In A::(int x). x=0Out A::(). m_x=4268020

 

可以看到尽管调用了A(0),m_x仍然没有改变,是4268020.
正确的方法是使用placement new:

 

 1     //A.h 2     #ifndef _A_H_ 3     #define _A_H_ 4     #include <stdio.h> 5     #include <new> 6     class A 7     { 8     public: 9             A()10             {11                     printf("In A::(). m_x=%d\n", m_x);12                     new(this) A(0);13                     printf("Out A::(). m_x=%d\n", m_x);14 15             }16 17 18             A(int x)19             {20                     printf("In A::(int x). x=%d\n", x);21                     m_x=x;22             }23 24 25     private:26             int m_x;27     };28 29     #endif

 

第11行应为: new(this) A(0); 也就是用当前对象来调用构造函数A(int x)构建一个“新”对象。其运行结果是:

 

    [root@tivu25 utcov]# ./UTest.out    In A::(). m_x=4268020    In A::(int x). x=0    Out A::(). m_x=0

 

可以看出,当前对象确实被改变了。

 

【转】 C++中如何在一个构造函数中调用另一个构造函数