2013-03-09 65 views
10

首先,我來自JAVA。在C++中創建類對象

在java中我們創建類似這樣的對象。

Example example=new Example(); 

Example類可以有構造函數或者不能有構造函數。

我可以使用C++一樣喜歡這個

Example* example=new Example(); 

如果構造函數是強制性的。

從本教程http://www.cplusplus.com/doc/tutorial/classes/

我,我們可以這樣創建對象。

Example example; 

哪些不需要構造函數。

我有兩個問題。

1)兩種創建類對象的方式有什麼區別。

2)如果我正在創建像Example example;這樣的對象,如何在單例類中使用它。

像我通常這樣做。

Sample* Singleton::get_sample() { 
    if (sample == NULL) { 
     sample = new Sample(); 
    } 
    return sample; 
} 

請指導我,如果我錯了。

回答

10

我可以使用相同的C++這樣的[...]如果構造函數是強制性的。從this tutorial我得到,我們可以創建這樣的對象[...]這不需要一個構造函數。

這是錯誤的。構造函數必須存在才能創建對象。構造函數可能由在某些情況下由編譯器隱式定義(如果不提供任何),但如果您希望實例化對象,則最終構造函數必須存在。實際上,一個對象的生命週期定義爲在構造函數例程返回時開始。

從段落的C++ 11標準的3.8/1:

[...] T類型的對象的生存期開始時:

- 存儲與所述適當的對準和大小爲T型,並且

- 如果對象具有非平凡的初始化,則其初始化完成。

因此,構造函數必須存在。

1)兩種創建類對象的方式有什麼區別。

當你實例化與自動存儲持續時間對象,像這樣的(其中X是一些類):

X x; 

您正在創建將當它超出範圍自動銷燬的對象。另一方面,當你這樣做時:

X* x = new X(); 

你正在動態地創建一個對象,並且你將它的地址綁定到一個指針。這樣,您所創建的對象將不當你x指針超出範圍破壞。

在現代C++中,這被看作是一個可疑的編程習慣:雖然指針是重要的,因爲它們允許實現reference semantics指針是不好的,因爲它們可能會導致內存泄漏(對象活得比他們所有的指針和從來沒有被破壞掉了),或在懸擺指針(指針活得比他們指出,提領時可能導致未定義行爲)的對象。

事實上,new創建對象時,你總是要記得delete摧毀它:

delete x; 

如果您需要參考的語義,並被迫使用指針,在C++ 11你應該考慮使用智能指針代替

std::shared_ptr<X> x = std::make_shared<X>(); 

智能指針照顧的內存管理問題,這是WH在給你頭痛的生指針。智能指針,其實幾乎相同,Java或C#對象引用。該「幾乎」是必要的,因爲程序員必須通過擁有智能指針不引入循環依賴的照顧。

2)如果我創建像實施例示例對象;如何在單例類中使用它。

你可以做這樣的事情(簡化代碼):

struct Example 
{ 
    static Example& instance() 
    { 
     static Example example; 
     return example; 
    } 

private: 

    Example() { } 
    Example(Example const&) = delete; 
    Example(Example&&) = delete; 
    Example& operator = (Example const&) = delete; 
    Example& operator = (Example&&) = delete; 

}; 
+0

可能會注意到,即使表達式沒有大括號,也會調用空構造函數。 – jiggunjer 2015-07-03 07:22:45

2

1)兩種創建類 對象的方式有什麼區別。

第一個是堆中構造對象的指針(由new)。 第二個是隱式構造的對象。 (默認構造函數)

2)如果我正在創建對象,如示例示例;如何在一個 單身人士課程中使用。

這取決於你的目標,最簡單的就是把它作爲課堂上的一員。

單個類的樣品,其具有對象從Example類:

class Sample 
{ 

    Example example; 

public: 

    static inline Sample *getInstance() 
    { 
     if (!uniqeInstance) 
     { 
      uniqeInstance = new Sample; 
     } 
     return uniqeInstance; 
    } 
private: 
    Sample(); 
    virtual ~Sample(); 
    Sample(const Sample&); 
    Sample &operator=(const Sample &); 
    static Sample *uniqeInstance; 
}; 
1
Example example; 

這裏例如是在棧上的對象。

Example* example=new Example(); 

這可以被分成:

Example* example; 
.... 
example=new Example(); 

在此,第一語句創建一個變量例如這是一個「指針示例」。當調用構造函數時,會在堆上分配內存(動態分配)。當程序員不再需要時,釋放這些內存是程序員的責任。 (C++沒有像Java那樣的垃圾回收)。

1

在第一種情況下,您使用newheap上創建對象。 在第二種情況下所創建的stack對象,所以它會被設置外出的範圍時的感覺。 在C++中,當您不需要它們時,您需要明確使用delete刪除heap上的對象。

從班級調用靜態方法,在你的主功能或其它地方做

Singleton* singleton = Singleton::get_sample(); 

1

1)什麼是創建類對象的兩種方法之間的差異。

一)指針

Example* example=new Example(); 
// you get a pointer, and when you finish it use, you have to delete it: 

delete example; 

二)簡單的聲明

Example example; 

你得到一個變量,而不是一個指針,它會被銷燬超出範圍就被宣佈。

2)的Singleton C++

This SO question 5幫助你

8
Example example; 

這是一個名爲Example類型的example變量的聲明。這將默認初始化涉及調用其默認構造函數的對象。該對象將具有自動存儲持續時間,這意味着它將在超出範圍時被銷燬。

Example* example; 

這是一個名爲example變量這是一個指針Example的聲明。在這種情況下,默認初始化會使其未初始化 - 指針無處指向。這裏沒有Example對象。指針對象具有自動存儲持續時間。

Example* example = new Example(); 

這是一個名爲example變量這是一個指針Example的聲明。如上所述,該指針對象具有自動存儲持續時間。然後將其初始化爲new Example();的結果。此new表達式創建一個具有動態存儲持續時間的Example對象,然後返回一個指向它的指針。所以example指針現在指向那個動態分配的對象。所述Example對象是值初始化這將調用用戶提供的構造,如果有一個或以其它方式初始化所有成員爲0

Example* example = new Example; 

這類似於前一行。所不同的是,Example對象是默認初始化,這將調用Example的默認構造函數(或離開它未初始化,如果它是類類型的不是)。

動態分配的對象必須爲delete d(可能與delete example;)。

2

首先,這兩種情況都會調用構造函數。如果你寫

Example *example = new Example(); 

,那麼你創建了一個對象,調用構造函數和檢索指向它的指針

如果你寫

Example example; 

唯一的區別是,你所得到的對象和指向它的指針。在這種情況下調用的構造函數與上面的默認構造函數(無參數)相同。

而對於單身的問題,必須通過簡單的書面調用你的靜態方法:

Example *e = Singleton::getExample(); 
0

有兩種方法可以使/在C創建對象++。

第一個是:

MyClass myclass; // if you don;t need to call rather than default constructor  
MyClass myclass(12); // if you need to call constructor with parameters 

第二個是:

MyClass *myclass = new MyClass();// if you don;t need to call rather than default constructor 
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters 

在C++中,如果你使用new關鍵字,對象將被存儲在堆中。它;如果要使用該對象一段長的時間和S非常有用的,如果你使用第一種方法,它將被存儲在堆棧中。它只能使用很短的時間。注意:如果你使用新的關鍵字,記住它會返回指針值。你應該用*聲明名字。如果使用第二種方法,它不會刪除堆中的對象。你必須使用delete關鍵字自己刪除;

delete myclass;