C++ - 一個構造函數調用構造函數的問題

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

相關文章
相關標籤/搜索