2017-02-03 10 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)デストラクタ

ときと私は2つのステップだけを必要とするポインタを使用します

ポインタの道

1)コンストラクタ

2)デストラクタ

私の質問は、私は新しいクラスを作成するか、私はポインタの方法を使用する必要があります非ポインタの方法を使用する必要があります。私はポインタを避けるべきだと言われています(私はここでもshared_ptrを使うことができます)。

+0

"modern" C++(C++ 11以来)ポインタは、多態性の外側でめったに必要とされません。 –

+0

なぜそれを言うのですか? std :: movesのために? std :: movesは代入演算子を避けるため? – pokche

+2

また、「ポインタ以外の方法」のために、初期化を1ステップで簡単に行うこともできます。 'A a = 1;'または 'A a(1);'と置き換え、割り当てステップをスキップします。 –

答えて

1

ルール:スタックにオブジェクトを作成することをお勧めします。スタック上にオブジェクトを作成すると、メモリ管理の作業が少なくなります。さらに効率的です。

いつあなたはにする必要がありますヒープ上にオブジェクトを作成しますか?ここで

は、それを必要とするいくつかの状況です:

  1. あなたは、配列のサイズは、実行時にのみ知られているオブジェクトの配列を作成する必要があります。

  2. 作成された機能を超えて生きるには、オブジェクトが必要です。

  3. ポインタは基本クラス型へのポインタを格納したり渡したりする必要がありますが、ポインタは派生クラスオブジェクトを指します。この場合、派生クラスオブジェクトは、ヒープメモリを使用して作成する必要があります。

+0

@einpoklum、それはより細かい点です。 –

+0

しかし、スタックアプローチを使用している間に実行する必要がある代入演算子についてはどうでしょうか。 – pokche

+1

1.必要な場合を除いて、割り当てる必要はありません。適切な値で開始するオブジェクトを作成します。 2.あなたのポストにあるような、単純なクラスの割り当ては安いです。 –

関連する問題