0

オブジェクト指向プログラミングでは、コンストラクターを使用するか、setValues のようなメソッドを使用するかの違いはありますか。setValues メソッドを使用しないでください。

class Controller{
public:
    Controller();
    Controller(int,int);
    setControllerValues(int,int);
private:
    int transactionValue;
    int transactionId;
};
4

3 に答える 3

2

クラス メンバーを初期化 するには、常にメンバー初期化子リストを使用する必要があります。

initializeと言うことに注意してください。これは、構築時に値を提供することを意味します。そうしない限り、setメソッドを明示的に呼び出してメンバーに特定の値を明示的に設定するまで、これらのメンバーの値は不確定になります。

setValuesそのためのコンストラクターの使用と同様のメソッドの使用に違いはありますか。

はい、違いがあります。C++ では、クラス メンバーを初期化する機会が提供されます。これは、メンバー初期化リストを介して行われます。メンバー初期化子リストでメンバーを初期化しない場合、メンバーは初期化されないままになります。つまり、値が不定になります。メンバーの状態が不確定であることは決して望まないでしょう。

set メソッドを使用する場合、実際にはメンバーを割り当てており、初期化していません。両者には次のような違いがあります。

Cost Member Initialization = Object Construction 
Cost of Member Assignment = Object Construction + Assignment
于 2013-03-20T08:44:55.617 に答える
1

コンストラクターは、オブジェクトの作成時に実行されるクラス内のメソッドです。通常、初期化コードをコンストラクターに入れます。クラスでコンストラクターを作成するのは非常に簡単です。次のサンプルを見てください。

public class Test
{
    public Test()
    {
        // Initialize code in the constructor.
    }
}
  • コンストラクターは値を返しません。
  • コンストラクタとデストラクタはアドレスを取得できないため、参照とポインタを使用することはできません。
  • コンストラクターは、キーワードvirtualで宣言することはできません。
  • コンストラクターがプライベートとして定義されている場合、そのクラスのインスタンスを作成することはできません。

方法:

  • メソッドでは、変数を定義できます。これらの変数のスコープは、メソッド内のみです。
  • パブリック変数を宣言すると、すべてのメソッドでアクセスされます。
  • メソッドにはリターンタイプが含まれる場合と含まれない場合があります。
  • メソッドは派生クラスで継承できます(メソッドはパブリックである必要があることに注意してください)。
于 2013-03-20T08:52:28.997 に答える
1

これは非常に幅広い質問であり、答えは文脈によって異なります。常に構築時に値を初期化する必要があり、賢明なデフォルトを提供したいように見えます.1つのコンストラクターでこれを行うことができます. これにより、オブジェクトを作成してから値を設定する手間が省けます。

オブジェクトの存続期間中に後で値を設定したい場合は、「セッター」が必要になります。これらを個別に微調整するために、1 つの結合されたセッターよりも個別の「セッター」を好む場合があります。

コード例を次に示します。

class Controller{
public:
    Controller(int value = SOME_SENSIBLE_DEFAULT,
               int id = SOME_OTHER_SENSIBLE_DEFAULT)
        :transactionValue(value)
        ,transactionId(id)
    {
    }

    void set_transaction_value(int value)
    {
        transactionValue = value;
    }

    void set_transaction_id(int id)
    {
        transactionid = id;
    }

private:
    int transactionValue;
    int transactionId;
};
于 2013-03-20T08:51:07.970 に答える