2011-10-13 116 views
0

在複製構造函數的情況下,如果在參數中使用指針而不是引用變量,會發生什麼情況?爲前。對象引用和對象指針

class MyClass 
{ 
private: int a; 
     char *str; 
public:... 
     ... 
     MyClass(MyClass *pObj) 
     { 
      .... 
      .... 
     } 
}; 
+1

通常的答案*如果... *問題是會發生什麼 - *寫一個示例程序,看看?你自己。*。 –

+1

這不是傳統意義上的複製構造函數 - 複製構造函數具有特定的簽名,「MyClass(const MyClass&)」... – Nim

回答

0

複製構造函數應該從一個對象而不是從指針複製。
爲什麼按引用傳遞而不是按值傳遞?因爲如果你不這樣做,拷貝構造函數將會創建參數副本,並且它將是一個無限循環。

+0

謝謝。正確,但會發生什麼,因爲我想要這樣的情況下,這種情況出現問題。我通過使用指針來嘗試代碼,並且它被成功編譯和執行。你能否給我任何例子,在這種情況下會失敗。 – Kushal

+0

你的想法調用像MyClass(MyClass *)是一個副本構造函數是無效的,因爲我們已經知道它作爲參數化構造函數 所以,程序會編譯好,運行良好,但不要說它是一個複製構造函數。 此外,你有沒有試過這個: MyClass * pObj = NULL; MyClass Obj(pObj); 它也運行嗎? – Abhinav

+0

這是絕對正確的..它顯示了分段故障。現在我收到了我的問題的回答。感謝abhinav。 – Kushal

1

根據定義,複製構造函數是一個帶有const引用參數的構造函數。 任何其他構造函數的定義是不是「拷貝構造函數」,這樣就不會被編譯器,當你寫類似調用:

MyClass x = y; 

MyClass x(y); 
4

MyClass的(MyClass的* pObj)

一個拷貝構造函數,它是一個Overloa ded構造函數

複製構造函數引用與參數相同的類型。例如:

MyClass的(MyClass的&)

編譯器生成你的類隱式,如果你不提供自己版本的拷貝構造函數。 當編譯器需要生成對象的副本時,將調用此複製構造函數。

上面說過的重載構造函數只會在您明確調用它時調用。

Code Sample

#include<iostream> 

class MyClass 
{ 
    private: int a; 
      char *str; 
    public: 
      MyClass(){}   
      MyClass(MyClass *pObj) 
      { 
       std::cout<<"\ninside *"; 
      } 
      MyClass(MyClass &pObj) 
      { 
       std::cout<<"\ninside &"; 
      }  
      void doSomething(MyClass obj) 
      { 
       std::cout<<"\ndoSomething"; 
      } 
}; 

int main() 
{ 
     MyClass ob,ob2; 
     MyClass obj2(&ob); //Explicitly invoke overloaded constructor 

     ob.doSomething(ob2); //Calls copy constructor to create temp copy of object 
     return 0; 
} 

注意輸出是:

inside * 
inside & 
doSomething 
+0

謝謝我也試過這個。意思是它不是構造函數,因爲我們明確地調用它。有沒有任何NULL問題可以發生,因爲引用不保留NULL值。並且指針保持爲NULL。我只是想澄清這一點。 – Kushal

+0

它是一個重載的構造函數。是的指針可以是NULL,並且引用不能爲NULL,如果引用爲NULL,那麼程序已經形成了。並且是的,如果重載的構造函數使用指針參數,則需要針對NULL進行gaurd。 –