FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgCtorsAssignDtors2

目次→教本→プログラマーのための案内Constructors, '=' Assignment-Operators, and Destructors (advanced, part #2)←オリジナル・サイト

構築子、 '=' 代入演算子、デストラクター(高度、パート #2) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

構築子、 '=' 代入演算子、およびデストラクタ を適切に使います。これらは、オブジェクトを 構築/初期化、代入、および破棄するための特別なメンバー手続きです(パート #2)。

目次
1. コンパイラーの相互作用(デフォルト構築子、コピー構築子、コピー代入演算子を使う)
2. 適切なマナーの規則(構築子、コピー構築子、コピー代入演算子、解体子用)
3. メンバーアクセス権への影響(構築子、コピー構築子、コピー代入演算子、解体子の宣言)




1. コンパイラーの相互作用(デフォルト構築子、コピー構築子、コピー代入演算子を使う)

代入中やコピー構築中に、コンパイラは、コピー代入演算子、デフォルト構築子、およびコピー構築子の、さまざまな呼び出しと対話して、結果のオブジェクトのコピーを最適化し、ユーザーが提供する、メンバー手続きを最大限に活用します。(たぶん非網羅的)。

注:
次の判断のいずれかが検証された場合、型は、デフォルト構築子を持っています:
- 明示的なデフォルト構築子があります。
- その項目の少なくとも 1つに初期化子があります。
- 少なくともそのメンバーの 1つは、デフォルト構築子自体を持つ、オブジェクトです。
- そのベース(存在する場合)にはデフォルト構築子があります(組み込み 'Object' は、デフォルト構築子を持ちます)。

特定の条件下では、コピー構成に対して、明示的なコピー代入演算子を、呼び出すことができます(明示的なコピー構築子がない場合)。
しかし逆に、条件に関係なしで、明示的なコピー構築子が、代入に対して呼び出されることはありません(明示的なコピー代入演算子がない場合)。

このページの頭に戻る


2. 適切なマナーの規則(構築子、コピー構築子、コピー代入演算子、解体子用)
構築子、コピー構築子、コピー代入演算子、およびデストラクタに影響する動作のリマインダー:
- 明示的な default-constructor を定義すると、コンパイラーによって作成された黙示的な default-constructor が、明示のものに置き換えられます。
- デフォルト以外の明示的な構築子を定義すると、コンパイラーによって構築される黙示的なデフォルト構築子は抑制されます。この正確なケースでは、デフォルト構築子はまったくありません!
- コンパイラーによって作成された、黙示的なコピー構築子(またはコピー代入演算子、または解体子)は、ユーザーが定義した、明示的なコピー構築子(またはコピー代入演算子、または解体子)に置き換えることができます。
- ただし、(デフォルト構築子とは対照的に)コピー構築子(またはコピー代入演算子または解体子)は常に存在し、コンパイラーによって黙示的に構築されるか、ユーザーによって明示的に定義されます。
- オブジェクトの構成がある場合、構成されたオブジェクトの型には、複合オブジェクトの宣言と一致する、黙示的または明示的な構築子が必要です。
- 型の継承がある場合、継承された型には、デフォルトの暗黙的または明示的な構築子が必要です(継承する型に、ユーザーによって明示的に定義された、定数コピー構築子がある場合を除く)。そして、これはオブジェクトが構築されていない場合でも、すべてです(コンパイラは、継承構造だけで、テストします)。
この動作は、 FreeBASIC に固有のようです。

上記のすべてから、コンパイルエラーとランタイムバグのほとんどを回避する「ゴールデンルール」を推測できます。

より安全なコードのための Golden rules(コンパイル時と実行時):
- ユーザーが、構築子を明示的に定義する場合、default-constructor も明示的に定義することを強く推奨します。
- ユーザーが、コピー構築子またはコピー代入演算子または解体子を(空でないボディで)明示的に定義する必要がある場合、3 つの同時(既知の「3つの規則」)に加えて、デフォルト構築子を定義することを推奨します(上のルールも適用されます)。

上記のすべてと特定のケース(継承あり)から、非常に安全な操作を可能にする、1つの「最大化ルール」を提案できます。

非常に安全なコード(コンパイル時および実行時)のための Maximizing rule ですが、ときに、実際の制約を最大化することもあります:
- ユーザーが、任意の形式の構築子手続き(任意の形式の copy-constructor を含む)や、任意の形式の let-operator 手続きや、デストラクタ手続きを、明示的に定義する必要がある場合、default-constructor と、標準の copy構築子と、標準の let 演算子と、デストラクタを、一緒に定義することを強く推奨します。
(これらの4つの明示的な手続きは、コンパイラからの対応する暗黙的な操作を、常に正しく多重定義するように、明示的に定義されています)

このページの頭に戻る


3. メンバーアクセス権への影響(構築子、コピー構築子、コピー代入演算子、解体子の宣言)
このようなメンバー手続きを宣言するときに、アクセス権を適用して、ユーザーが何か特定のコマンドを(Type の外から)実行できないようにできます。

デフォルトの、構築子、コピー構築子、コピー代入演算子、およびデストラクタは、コンパイラによって黙示的なバージョンを構築できる唯一のメンバー手続きです。
したがって、Type の外部からのユーザーによるアクセスを禁止する場合は、宣言時に、制限されたアクセス権(パブリックではない)を使った、明示的なバージョンで、これらを多重定義する必要があります。
さらに、このようなメンバー手続きは、プログラムで実際に呼び出されないと、実装されていない(本体を定義していない)ことがあります。
このページの頭に戻る


参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2020-08-08 09:36:44
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承