-1

私は現在 C++ を学んでおり、コンストラクターに値を与える方法を理解するのにいくつか問題があります。エクササイズはうまくいきましたが、どの方法が最もスマート/ベストなのかわかりません。方法番号。1

class Vector2d{

public:
Vector2d(double x, double y):x(x),
y(y)
{

}

と方法 2

class Vector2d{

public:
void set_values (double,double);
Vector2d()
{

}

void Vector2d::set_values (double a, double b) {
  x = a;
  y = b;
}

いくつかのチュートリアルを読んで両方の方法を見つけ、両方の方法が機能しています。新しいボイドを書く必要がないので、最初のものはより効率的だと思いますが、正確にはわかりません

:x(x),
y(y)

やっている/意味.

よろしくお願いします!

4

6 に答える 6

3

C ++では、次のように実行します

:x(x),
y(y)

実際には、コンパイル時に命令を保存します。クラス用のスペースが作成されると、コンパイラは実際にこれらの変数をインラインで直接初期化します。

ですから、その方法が良いと言えます。

于 2013-03-29T17:02:59.420 に答える
2

[コード...] が何をしているのか、何を意味しているのか正確にはわかりません。

彼らはあなたのメンバー変数を初期化しています。

コンストラクターのパラメーターに同じ名前が付けられているため、おそらく混乱しています。これに相当するものを考えてみましょう:

Vector2d(double x_param, double y_param)
  : x(x_param)  // initialize member variable "x"
  , y(y_param)  // initialize member variable "y"
{

}

クラスがこのコンストラクターと、構築後に値を変更する関数の両方を持つことは合理的です。set_values

于 2013-03-29T17:02:31.207 に答える
1

#1を使用すると、コンストラクターを呼び出してx、yを初期化するようにプログラムに指示しています

#2 では、operator= を呼び出して x,y の値を次のように上書きします: 2 つのコンストラクターを呼び出して得られる値: x.operator=(double(right_value))

関連するタイプは「double」であるため、それほど違いはありませんが、いくつかの複雑なクラスでは大きく異なると思います

于 2013-03-29T17:04:34.543 に答える
1

最初の方法は、コンストラクターを呼び出してメンバーを初期化することです。2番目の方法は、メンバー関数を呼び出して、割り当てによってメンバー変数の値を変更することです。デフォルトのコンストラクターのみを定義するため、最初はメンバーがデフォルト値で初期化され、次に関数を呼び出すと、set_valuesその関数本体内で再割り当てされます。現在の例では、同じ効果があります。ただし、通常は、コンストラクターの初期化リストでメンバー変数を初期化する方が適切です。2 番目の方法はsetter関数のように見えます。静的ではないため、2 番目の方法を使用してクラス メンバー変数を初期化することはできません。

オブジェクトを作成する場合は、最初の方法を使用することをお勧めします。初期化子リストを使用すると、メンバーが作成され、指定された値で 1 回だけ初期化されます。

于 2013-03-29T17:09:44.983 に答える
1

パラメーターを持つコンストラクターは、クラスのメンバー属性を初期化するために作成され (最初のソリューション)、デフォルトのコンストラクター (パラメーターなし - 2 番目のソリューションのコンストラクター) とは異なります。

2番目のソリューションでは、値を設定する必要があるときにいつでも呼び出すことができるセッター(メンバー属性の値を設定するメンバー関数)を使用していますが、パラメーターを持つコンストラクター(1番目のソリューション)では、値のみを設定できますそのクラスにオブジェクトを作成するときに初めて。

例えば;

オブジェクトを作成するとき。

Vector2d vec2d(2.3, 4.5);

x と y の値をそれぞれ 2.3 と 4.5 に設定しますが、プログラムで値を再度設定する必要がある場合はどうすればよいでしょうか。次に、次のようなセッター関数を使用します。

vec2d.set_values(5.0, 7.8);

つまり、シナリオに応じて必要なものだけを使用します。値を再度設定したくない場合は、パラメーターを使用したコンストラクター (最初のソリューション) が最適です。

私たちは次のことを行います

:x(x),
y(y)

コンストラクターのパラメーターを介して取得される x および y の値を、クラス メンバー x および y に割り当てます。と同じです。

class Vector2d{

public:
  Vector2d(double x, double y)
  {
    //"this" pointer is used to differentiate the variables
    this->x = x;
    this->y = y;
  }
}

thisまたは、ポインターについてまだ知らない場合は、簡単にするために別の名前を使用することをお勧めします。

class Vector2d{

public:
  Vector2d(double a, double b)
  {
    x = a;
    y = b;
  }
}
于 2013-03-29T17:12:13.257 に答える
0

別の関数を使用してオブジェクトを初期化する場合、コンストラクター呼び出しと初期化の間よりも、オブジェクトは初期化された状態になります。

あなたがそれを必要とする唯一のケース - あなたが何をしているのかを本当に知っているとき。

また、コンストラクターでの初期化も高速です。あなたが書くとき

my_class()
: field_(value)
{
}

フィールドにコピーvalueして初期化します。それ以外の場合は、コピー時に初期化されますが、これはオーバーヘッドです。

于 2013-03-29T17:03:54.157 に答える