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

点击(此处)折叠或打开

#ifndef _A_H_

#define _A_H_

#include stdio.h>

#include new>

class A

{

public:

A()

{

printf("In A::(). m_x=%d\n", m_x);

A(0);

printf("Out A::(). m_x=%d\n", m_x);

}

A(int x)

{

printf("In A::(int x). x=%d\n", x);

m_x=x;

}

private:

int m_x;

};

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

点击(此处)折叠或打开

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

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

点击(此处)折叠或打开

//A.h

#ifndef _A_H_

#define _A_H_

#include stdio.h>

#include new>

class A

{

public:

A()

{

printf("In A::(). m_x=%d\n", m_x);

new(this) A(0);

printf("Out A::(). m_x=%d\n", m_x);

}

A(int x)

{

printf("In A::(int x). x=%d\n", x);

m_x=x;

}

private:

int m_x;

};

#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

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

《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:

京东亚马逊 China pub上学吧 1号店