今天作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