C ++の使用unique_ptr

Use C Unique_ptr



スマートポインタは、リソースを動的に割り当てるために使用されます。多くの種類のスマートポインタが、C ++で次のようなさまざまな目的で使用されます。 auto_ptrunique_ptr 、 と shared_ptr 。 auto_ptrポインターは、新しいバージョンのC ++では非推奨になりました。 unique_ptrは、auto_ptrの代わりに使用されます。このポインタのオブジェクトは、ポインタの所有権を取得できます。このポインタのオブジェクトはポインタを一意に所有し、他のポインタはオブジェクトを指すことができません。 unique_ptrは、オブジェクトを自動的に削除します。このポインタは、オブジェクトが破棄された場合、オブジェクトの値が変更された場合、またはreset()関数が呼び出された場合に、これらのオブジェクトを管理します。このチュートリアルでは、unique_ptrの機能とこのポインターの使用法について説明します。

主要コンポーネント:







unique_ptrオブジェクトの2つの主要コンポーネントを以下に示します。



A.保存されたポインタ:



一意のポインタによって作成されたオブジェクトを管理するために使用されます。ポインタ作成時に作成され、さまざまな方法で変更できます。





B.保存された削除者:

管理対象オブジェクトを削除するために使用される、格納されたポインタ型の引数を取ります。ポインタ作成時にも作成され、さまざまな方法で変更できます。



例1:コンストラクターを使用してクラスのポインターオブジェクトを作成する

クラスの一意のポインタオブジェクトを宣言し、クラスのメソッドにアクセスする方法は、次の例に示すようにオブジェクトを使用することです。コンストラクターとパブリックメソッドを持つクラスがコードで宣言されています。コンストラクターには3つの引数があります。最初の一意のポインターは、3つの引数値を使用してコンストラクターを呼び出すことによって作成されました。 NS 結果() メソッドは、コンストラクターの3つの引数値の合計を計算するポインターオブジェクトによって呼び出されます。次に、コンストラクターを呼び出さずに2番目の一意のポインターオブジェクトが作成され、最初のポインターが2番目のポインターに移動されます。 NS 結果() メソッドは、2番目のポインタオブジェクトによって呼び出されます。

//必要なライブラリを含める

#含む

#含む

usingnamespace std;

//クラスを定義する
クラスの追加{{

int number1、number2、number3;
公衆:
//コンストラクターを宣言します
添加((int a、int b、int c)。
{{
number1 = a;
number2 = b;
number3 = c;
}
//を計算する方法を宣言します
int結果(()。
{{
戻るnumber1 + number2 + number3;
}
};
int main(()。
{{
//最初のポインタを宣言します
unique_ptrポインタ1((新しい追加((フォーファイブ5530)。)。;

費用<<'最初のポインタを使用した合計の結果:'<結果(()。 <<'NS';
//2番目のポインターを宣言します
unique_ptrポインタ2;
//最初のポインターを2番目のポインターに移動します
ポインタ2 =移動((ポインタ1)。;

費用<<'2番目のポインターを使用した合計の結果:'<結果(()。 <<'NS';
return0;
}

出力:

上記のコードを実行すると、次の出力が表示されます。 45、55、および30の合計は130であり、両方のポインターに対して出力されています。

例2:コンストラクタとデストラクタを使用してクラスのポインタオブジェクトを作成する

コンストラクタとデストラクタを使用してクラスの一意のポインタオブジェクトを宣言する方法を次の例に示します。このクラスには、1つの引数を持つコンストラクタ、クラス変数の値に対するDisplay()という名前のパブリックメソッド、およびクラスのオブジェクトを破棄する前に破棄メッセージを出力するデストラクタが含まれています。 Display()メソッドは、コード内に一意のポインターオブジェクトを作成した後に呼び出されます。

//必要なライブラリを含める

#含む

#含む

usingnamespace std;

//クラスを定義する
クラスのお客様
{{
文字列名;

公衆:
//コンストラクターを宣言します
お客様((文字列n)。
{{
名前= n;
費用<<'リソースが割り当てられます。NS';
}

//顧客名を印刷する方法を宣言する
ボイド表示(()。
{{
費用<<'顧客の名前は次のとおりです:'<<名前<<'NS';
}

//デストラクタを宣言します
〜お客様(()。
{{
費用<<'リソースが破壊されました。NS';
}
};
int main(()。
{{
//unique_ptrが所有するResourceオブジェクトを割り当てます
unique_ptruPointer{{新規のお客様((「ミールアッバス」)。 };
uPointer->>画面(()。;
return0;
}

出力:

上記のコードを実行すると、次の出力が表示されます。

例3:所有権を譲渡した後にポインターを確認する

一意のポインターの所有権を確認する方法は、クラスの2つの一意のポインターを作成することにより、次の例に示されています。 2つの文字列変数とパブリックメソッドを持つクラスがコードで宣言されています。クラスのBook_details()メソッドは、クラスの最初の一意のポインタオブジェクトを作成した後に呼び出されます。次に、2番目の一意のポインターオブジェクトが作成され、最初のポインターが2番目のポインターに移動されて、最初のポインターが破棄されます。両方のポインタの所有権は後で確認する必要があります。

//必要なライブラリを含める

#含む

#含む

usingnamespace std;

//クラスを定義する
クラスの本{{

文字列タイトル=「C ++プログラミング言語」;
文字列の作成者=「ビャーネ・ストロヴルプ」;

公衆:
//本の詳細を印刷する方法を宣言する
voidBook_details(()。
{{
費用<<「本の名前:」<<題名<<'NS';
費用<<'著者名:'<<著者<<'NS';
}
};
int main(()。
{{
//最初のポインタを宣言します
unique_ptrポインタ1((新しい本(()。)。;

ポインタ1->>Book_details(()。;
//2番目のポインターを宣言します
unique_ptrポインタ2;
//最初のポインターを2番目のポインターに移動します
ポインタ2 =移動((ポインタ1)。;

//最初のポインタを確認してください
もしも ((static_cast((ポインタ1)。)。費用<<'最初のpoinerはnullではありませんNS';
elsecout<<'最初のpoinerはnullですNS';
//2番目のポインタを確認してください
もしも ((static_cast((ポインター2)。)。費用<<'2番目のpoinerはnullではありませんNS';
elsecout<<'2番目のpoinerはnullですNS';

return0;
}

出力:

上記のコードを実行すると、次の出力が表示されます。出力によると、最初のポインターの所有権が削除され、メッセージ、 最初のポインタはnullです 最初のポインタを印刷しました。 2番目のポインターの所有権が存在し、メッセージ、 最初のポインタがnullではありません 2番目のポインタを出力しました:

結論:

このチュートリアルでは、C ++プログラミングで一意のポインターを使用する目的について、複数の例を使用して説明しました。ここでは、一意のポインターを作成し、ポインターの所有権を転送し、ポインターの現在の所有権を確認する方法について説明し、読者が一意のポインターの使用法を正しく理解できるようにします。