今天作C++的实验,题目是写一个二维点的类,而后让一个三维点的类继承它而后扩展。题目是通常学面向对象语言的经常使用例子。函数
而后遇到一个这样的问题:以前用Java的时候写构造方法的时候,若是须要用一个构造方法调用同一个类的另外一个构造方法,建议咱们这样写(以写一个二维点类为例):this
/*********** Java *************/ public class Point2D{ private double x; private double y; public Point2D(){ this(0,0); } public Point2D(double x,double y){ this.x=x; this.y=y; } /************getter && setter************/ }而后在C++里面没法经过this(0,0)这种方式来来调用Point2D(double x,double y)。spa
若是你用C++写成这样:指针
/*********** C++ *************/ class Point2D{ public: Point2D(){ Point2D::Point2D(0,0); } Point2D(double x,double y){ this->x=x; this->y=y; } /************getter && setter************/ private: double x; double y; }那么你仍是会错,由于在Point2D()这一个构造函数里面,咱们作的操做是调用了Point2D(0,0)生成了一个匿名对象,而后什么事都没有干了。因此若是你用Point2D()初始化一个对象之后,检查这个对象的值会发现这个对象的x和y都没有进行任何初始化。code
若是你想像Java那样调用构造函数的话,能够这样写:对象
/*********** C++ *************/ class Point2D{ public: Point2D(){ new (this)Point2D::Point2D(0,0); } Point2D(double x,double y){ this->x=x; this->y=y; } /************getter && setter************/ private: double x; double y; }实际上这种技术有个名字叫placement new,与通常的operator new不同。解释以下:blog
new (pointer)构造函数() 里面,看括号里面的是一个指针整句话的意思就是生成一个对象,而后将对象放在指针指向的地址那里。这种方法能够在任意地方构造对象。继承
在网上找到相关的资料:http://stackoverflow.com/questions/22604598/what-does-new-this-meanget