3

就職の面接でこの質問をされましたが、それをまとめた後でも、結果がわかりません...

私は次のクラスを持っています:

class Point
{
    public:
    Point(double x = 0, double y = 0) { m_X = x; m_Y = y; }

    double m_X, m_Y;
};

そしてmain.cppは:

int main()
{
    double a = 1, r = 1, xCoord = 5, yCoord = 7;

    Point p = (a+r*xCoord , a+r*yCoord);

    cout<<"X = "<<p.m_X<<" Y = "<<p.m_Y<<endl;

    return 0;
}

クラスpのデータメンバーは次の値を取得しています。

m_X = a+r*yCoord, m_Y = 0

さて、それはなぜですか?

4

5 に答える 5

4

コンマ演算子と非明示的コンストラクターのため。式(a + r * xCoord , a + r * yCoord)はコンマ演算子のアプリケーションであり、値はです。これa + r * yCoordで、コンストラクターの1パラメーターの暗黙的な形式がPointこの値で使用され、2番目のパラメーターがデフォルトになります。

コンストラクターを作成することで、このような間違いが忍び寄るのを防ぐことができますexplicit。これは、暗黙の変換が本当に必要な場合を除いて、1つの引数で呼び出すことができるコンストラクターに一般的に推奨されます。

目的の動作を得るには、直接初期化する必要があります。

Point p(a + r * xCoord, a + r * yCoord);
于 2013-03-04T08:25:40.530 に答える
2

それはトリックの質問です...表現

(a+r*xCoord , a+r*yCoord)

comma operator式なので、コードは実際には

Point p = a+r*yCoord;

コンストラクターは変換コンストラクターとして使用できます(そうではないためexplicit)。したがって、これは次のように記述するのと同じです。

Point p(a+r*yCoord, 0);

「期待される結果」を得るには、等号を削除して次のように記述します。

Point p(a+r*xCoord , a+r*yCoord);

一般に、たとえば次のようなデフォルトの引数に依存するのではなく、2つの異なるコンストラクターを使用することをお勧めします。

struct P2d {
    double x, y;
    P2d() : x(0), y(0) { }
    P2d(double x, double y) : x(x), y(y) { }
};

コンストラクターが1つのパラメーターのみを取得する(または、例のように1つのパラメーターのみを渡すことができる)場合は、コンストラクターに常に特別な注意を払う必要がありexplicitます。

最後の注意点は、最初の式には副作用がなく、コンパイラがこれがおそらく間違いであったことを検出できるはずなので、コードで使用されているコンマ演算子が警告を生成しなかったのは奇妙なことです。

于 2013-03-04T08:27:36.797 に答える
1
Point p = (a+r*xCoord , a+r*yCoord);

(式)は、を使用しますcomma operator。これは、すべての用語を順番に評価し、右端を返します。

正しい形式は

auto p = Point(a+r*xCoord , a+r*yCoord);
Point p(a+r*xCoord , a+r*yCoord);
于 2013-03-04T08:25:28.367 に答える
1

あなたは変更したいかもしれません

Point p = (a+r*xCoord , a+r*yCoord);

の中へ

Point p (a+r*xCoord , a+r*yCoord);

前者は、コンマ演算子を使用して1つの値(コンマ演算子式の最後の値)を指定し、それをオブジェクトに割り当てます。これにより、メンバーがその値に設定されx、デフォルトでyメンバーがゼロになります。

後者は、2つの引数を使用してコンストラクターを呼び出します。

于 2013-03-04T08:26:20.543 に答える
1

doubleこれは、へ の変換演算子を使用しているためですPoint。コピーの初期化(=符号付きの初期化)を使用する場合、の右側の式=は最初に左側の型に変換され、次にコピーコンストラクターが使用されます(少なくとも概念的には)。コピーの初期化を使用して複数の引数を指定する方法はありません。したがって、右側の式はです(a + r*xCoord, a + r*yCoord)。また、コンマはコンマ演算子(コンマ句読点ではありません)であり、左側の引数、次に右側の引数を評価し、結果として右側の引数の結果を取得します。(そして、左側の引数の結果は破棄されます。)

于 2013-03-04T08:28:43.997 に答える