#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を使うことができます)。
"modern" C++(C++ 11以来)ポインタは、多態性の外側でめったに必要とされません。 –
なぜそれを言うのですか? std :: movesのために? std :: movesは代入演算子を避けるため? – pokche
また、「ポインタ以外の方法」のために、初期化を1ステップで簡単に行うこともできます。 'A a = 1;'または 'A a(1);'と置き換え、割り当てステップをスキップします。 –