2017-02-03 46 views
0
#include <iostream> 

class A{ 

public: 
A(){std::cout << "basic constructor called \n";}; 

A(const A& other) { 
    val = other.x 
    std::cout << "copy constructor is called \n"; 
} 

A& operator=(const A& other){ 
    val = other.x 
    std::cout << "\n\nassignment operator " << other.val << "\n\n"; 
} 
~A(){ 
    std::cout << "destructor of value " << val <<" called !!\n"; 
} 


A(int x){ 
    val = x; 
    std::cout << " A("<<x<<") constructor called \n"; 
} 

int get_val(){ 

    return val; 
} 
private: 

int val; 
}; 

int main(){ 

    // non pointer way 
    A a; 

    a = A(1); 

    std::cout << a.get_val() << std::endl; 

    a = A(2); 

    std::cout << a.get_val() << std::endl; 
    // pointer way 
    A* ap; 

    ap = new A(13); 

    std::cout << ap->get_val() << std::endl; 

    delete ap; 
    ap = new A(232); 

    std::cout << ap->get_val() << std::endl; 

    delete ap; 

    return 0; 
} 

我最初創建了一個超出默認構造函數的對象,然後將tmp r值對象A(x)指定爲a。這最終稱爲assignment operator。因此,在這種方法也有涉及3個步驟哪一種在指針方式和非指針方式之間進行選擇?

非指針方式

1)構造

2)賦值運算符

3)析構函數

凡當我用指針它只需要兩步

指針方式

1)構造

2)析構函數

我的問題是我應該用非指針的方式來創建新的類或我應該使用指針方式。因爲我曾經說過我應該避免使用指針(我知道我也可以在這裏使用shared_ptr)。

+0

在「現代」C++(自C++ 11以來)指針很少需要多態之外。 –

+0

你爲什麼這麼說?由於std :: moves?因爲std :: moves避免了賦值操作符? – pokche

+2

你也可以很容易地在單步執行「非指針方式」的初始化,例如, 'A a = 1;'或'A a(1);',從而跳過分配步驟。 –

回答

1

經驗法則:傾向於在堆棧上創建對象。在堆棧上創建對象時,內存管理的工作量較少。它也更有效率。

你什麼時候必須在堆上創建對象?

下面是需要它的一些情況:

  1. 您需要創建在數組的大小隻能在運行時被稱爲對象的數組。

  2. 你需要一個物體超越其構建的功能。

  3. 您需要存儲和/或繞過指向基類類型的指針,但指針指向派生類對象。在這種情況下,派生類對象很可能需要使用堆內存創建。

+0

@einpoklum,這是一個更好的點,我想。 –

+0

但是,如何使用堆棧方法時需要完成的賦值運算符呢? – pokche

+1

1.除非需要,否則不需要指定。您可以使用正確的值創建對象。 2.對於簡單的課程,作業很便宜,比如你在你的文章中。 –