2016-07-06 27 views
1

在C++中學習OOPS概念時,我遇到了本教程鏈接。 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm使用Constructor參數實例化一個類對象與不帶參數的*運算符之間的區別C++

在基類Shape,它有兩個參數來設置其受保護的變量和main()我想創建一個對象Shape類的唯一方法是通過執行類似Shape shape(2,4)給構造Shape類匹配的構造。

有人可以說實例化Shape *shape沒有任何參數的工作和創建對象之間的差異是什麼Shape shape(2,4)Shape *shape

#include <iostream> 

using namespace std; 

class Shape{ 
protected: 
    int w,h; 

public: 

    Shape(int a, int b){ 
     w=a; 
     h=b; 
    } 
    int area(){ 
     cout << "Shape class area" << endl; 
     return 0; 
    } 
}; 

class Rect:public Shape{ 

public: 

    Rect(int a, int b):Shape(a,b) {} 
    int area(){ 
     cout <<"Rect class area " << endl; 
     return w*h; 
    } 
}; 

class Tri:public Shape{ 

public: 

    Tri(int a, int b):Shape(a,b) {} 
    int area(){ 
     cout << "Tri class area" << endl; 
     return (w*h)/2; 
    } 
}; 

int main(){ 

    Shape *shape; 
    Rect r(4,5); 
    Tri t(4,5); 
    shape=&r; 
    shape->area(); 
    shape=&t; 
    shape->area(); 
    return 0; 
} 
+2

顯示你的代碼。 –

+0

與其依靠人們閱讀鏈接的文章(當數年後有人發現此問題時可能不存在),請將相關代碼示例作爲問題的一部分發布,以便我們可以自行理解它。堆棧溢出不僅僅是爲了你現在需要的答案,而是其他人未來的相同問題。 –

+0

道歉。在上面的第一個問題中添加了代碼。謝謝 – Gangadhar

回答

1

聲明

Shape *shape; 

不創建類形狀的任何實例。 它聲明瞭一個變量,該變量是類型爲Shape *的指針,並且未被初始化,即它具有不確定的值,前提是該聲明聲明局部變量。

至於構造函數,那麼帶有兩個參數的類的唯一構造函數也是該類的默認構造函數,因爲每個參數都有一個默認參數。

Shape(int a=0, int b=0) 
      ^^^  ^^^ 
{ 
    //... 
} 

因此可以寫例如被創建的對象的

Shape sh; 

和數據成員將被這些默認參數進行初始化。 此聲明等效於

Shape sh(0, 0); 
+0

謝謝!我很快在上述程序中添加了代碼。 形狀sh; sh.area()//這給了我一個錯誤,說沒有匹配的構造函數 而我寫的時候 Shape sh(0,0); sh.area()//它能夠正確訪問方法 我誤解了你的答案。請澄清。謝謝!! – Gangadhar

+0

@Gangadhar代碼與引用中顯示的代碼不對應,因爲Shape類的構造函數現在不是默認的構造函數。它的參數沒有默認參數。 –

+0

非常感謝您的澄清。我看到你提到的區別。 – Gangadhar

1
Shape *shape; 

這不會創建一個Shape對象。它創建一個未初始化的Shape指針,該指針可用於存儲Shape對象(或從Shape派生的類的對象)的地址。你可以看到它在你鏈接到頁面中:

// store the address of Rectangle 
shape = &rec; 
// call rectangle area. 
shape->area(); 
+0

所以這意味着。如果我們想要一個Shape類的對象,它應該分別實例化,並且不能重複使用相同的*形狀? – Gangadhar

+0

@Gangadhar:我不明白你的意見。 –

+0

所以如果我的班級形狀有另一種方法說 void print(){cout <<「Print something」; } 我可以做shape.print()之類的東西嗎?還是我需要爲Shape類實例化一個不同的對象? – Gangadhar

0

聲明一個Shape*不是一個運營商,這是一個不同的類型。該類型是指向形狀的指針。這與以多種方式直接聲明形狀不同:

  • 它不是形狀,而是指向形狀的變量。當使用繼承時,我們可以使用指向基類的指針(Shape*)指向子類(Rectangle)。
  • 請注意,我沒有在Rectangle之後放*。這是因爲指針指向一個類的實例,而不是指向另一個指針,除非指針指向了指針。
  • 聲明Shape*時,構造函數未被調用,因爲指針將指向現有實例或新實例,使用new運算符或不指定任何實例。
  • 指向無的指針通常稱爲空指針。
  • 你應該閱讀關於多態性之前的指針和引用。

沒有參數聲明的指針有一個未定義的值。如果你想要一個空指針,你應該這樣聲明:

Shape* ptrToShape = nullptr; 
+0

非常感謝 – Gangadhar

相關問題