-4

C++ で最初のクラスを作成しようとしています。というファイルを作成しgeometryitems.cpp、これを実行しています:

using namespace std;

class Point
{
    double x, y, z;
public:
    // constructor
    Point(double x, double y, double z)
        {

        }

    // copy constructor
    Point(const Point& pnt)
        {
            x = pnt.x;
            y = pnt.y;
            z = pnt.z;
        }

    void display()
        {
            cout << "Point(" << x << ", " << y << ", " << z << ")";
        }
};

次に、次のように別のファイルから呼び出します。

#include <iostream>
#include <cstdio>
#include "geometryitems.cpp"
using namespace std;

int main()
{
    // initialise object Point
    Point pnt = Point(0, 0, 0);
    cout << "Point initialisation:" << endl;
    pnt.display();

    double t = 0;
    cout << endl << t << endl;

    Point pnt2 = pnt;
    pnt2.display();

    // keep the terminal open
    getchar();

    return 0;
}

出力は次のとおりです。

t通常の 0 として表示されますが、その他のゼロはその他の数値です。それらが非常に小さな数であったかどうかは理解できますが、非常に大きな数もあります...

のゼロがPoint奇妙な数字として表示されるのはなぜですか? 通常のゼロのように見せる方法はありますか?

4

3 に答える 3

5

コンストラクターでメンバー変数を値に設定していません。

Point(double x, double y, double z)
{

}

あなたが必要

Point(double x, double y, double z) : x(x), y(y), z(z) {}

これにより、コンストラクターの初期化リストを使用して、データ メンバー、、xおよびyが初期化されます。z

コピー コンストラクターも削除する必要があります。コンパイラで合成されたものは問題なく動作します。

于 2013-10-31T08:49:27.203 に答える
2

空っぽです

Point(double x, double y, double z)
{

}

したがって、Point pnt = Point(0, 0, 0);何も初期化しません。メンバー初期化リストを使用します。また、詳細についてはこちらをご覧ください。

Point(double x, double y, double z) : x(x), y(y), z(z)
{                                  //^^^^^^^^^^^^^^^^^^
                                   // Initializer list
}

そのコピー コンストラクターは、初期化されていない値を別のオブジェクトにコピーしています。

于 2013-10-31T08:49:04.753 に答える
0

あなたのコンストラクタはバグがあります。メンバーは初期化されていません。次のように変更します。

Point(double x_, double y_, double z_)
: x(x_), y(y_), z(z_)
{
}
于 2013-10-31T08:50:54.143 に答える