2015-12-30 22 views
0

我試圖讓我的頭繞着指針/破壞等。我使用下面的代碼來使用指針而不是標準的int;然而,如果我在構造函數中使用初始化列表,它將不會編譯,而如果我只是在構造函數方法中分配它,它工作正常。是否有可能在初始化列表中使用推理指針

#include<iostream> 
using namespace std; 

class Point 
{ 
private: 
    int *x; 
    int y; 
public: 
    Point(int x1, int y1):*x(x1),y(y1) {} 

    // Copy constructor 
    Point(const Point &p2) {*x = *p2.x; y = p2.y; } 
    // ~Point(){delete x;} 

    int getX()   { return *x; } 
    int getY()   { return y; } 
    void setX(int x1){*x=x1;} 
}; 

int main() 
{ 
    Point p1(10, 15); // Normal constructor is called here 
    Point p2 = p1; // Copy constructor is called here 
    p2.setX(35); 

    // Let us access values assigned by constructors 
    cout << "p1.x = " << p1.getX() << ", p1.y = " << p1.getY(); 
    cout << "\np2.x = " << p2.getX() << ", p2.y = " << p2.getY(); 

    return 0; 
} 

我也有一個第二個問題,這是initize一個INT指針這樣的正確方法:

int *p = new int; 
*p = 3; 

或像這樣:

int *p; 
*p = 3; 

我發現,如果我給你nullptr或0並嘗試顯示指針,它不輸出任何內容是否有這個原因?例如:

int *p = 0; 
*p = 3; 
cout << *p; 
+0

你永遠不會使指針'點:: x'點任何地方,所以每次嘗試解除引用時,都會有*未定義的行爲*。另外,'0'是*空指針*並且不是有效地址,試圖取消引用空指針也會導致未定義的行爲。 –

回答

3

Point(int x1, int y1):*x(x1),y(y1) {}是不允許的語法。您只能在初始化列表中初始化成員,並且*x不是成員。順便說一句,即使編譯器會允許它,它會產生未定義的行爲 - 你會解引用一個未初始化的指針。

的一種方式(至少,syntaxically正確的,不會導致不確定的行爲在這個線)將

Point(int x1, int y1): x(new int(x1)), y(y1) {} 

第二個問題實際上是同爲第一。在第二個示例中,您將訪問指針而不首先初始化它,最終會導致未定義的行爲。

0

當構造函數調用Point(int x1, int y1):*x(x1)時,您的x地址不正確(未分配),因爲它未初始化,因此它可以指向RAM中的任何位置。

當你這樣做*x(x1),如果允許,你會:

  • 要麼破壞你的當前內存
  • 無論是段錯誤