7

multi::multi(int, int)これが、関数内でクラスコンストラクターを呼び出そうとしているプログラムですvoid multi::multiply()。出力は

30

30

期待される代わりに

30

25

なんで?

#include <iostream.h>

class multi{
    private:
        int a;
        int b;
    public:
        multi(int m, int n){
            a = m;
            b = n;
        }

        void multiply(){
            cout << "\n\n" << a*b;
            multi (5, 5);
            cout << "\n" << a*b;
        }
};

main(){
    multi x(5,6);

    x.multiply();
return 0;
}
4

5 に答える 5

9
multi (5, 5);

一時オブジェクトを作成し、完全な式の終わりまでに破棄されます。乗算や印刷は行いません。

目的の出力を表示するには、reset()メンバー関数をクラスに追加できます。

class multi{
    private:
        int a;
        int b;
    public:

        multi(int m, int n) : a(m), b(n) {}   //rewrote it

        void reset(int m, int n) { a = m; b = n; }  //added by me

        void multiply(){
            cout << "\n\n" << a*b;
            reset(5, 5);  //<-------------- note this
            cout << "\n" << a*b;
        }
};

ちなみに、コンストラクタを定義するときはmember-initialization-listを使用することをお勧めします。

于 2013-01-18T15:29:37.557 に答える
2

コンストラクターを呼び出すと、multi(5, 5)実際には、すぐに破棄される一時オブジェクトが作成されます。

于 2013-01-18T15:29:55.697 に答える
1

multi(5, 5);class の一時オブジェクトを作成するため、これは機能しません。これmultiは、何にも使用されないため、すぐに破棄されます。

multiply()は class のメンバー関数であるためmulti、プライベート メンバーにアクセスできるためab直接設定するだけで済みます。multiply次のように書き換えることで、期待される出力を得ることができます。

    void multiply()
    {
        cout << "\n\n" << a*b;
        b = 5;
        cout << "\n" << a*b;
    }
于 2013-01-18T15:30:10.937 に答える
1

このようにコンストラクターを呼び出すことはできません。あなたのコードが行うことは、 の新しい一時インスタンスを作成することmultiです。これはすぐに破棄されます。

オブジェクトが構築されると、そのコンストラクターを再度呼び出すことはできません。assign()クラスに関数などを作成します。

于 2013-01-18T15:30:34.157 に答える
0

既に作成されたオブジェクトのコンストラクターを呼び出すことはできません。コードで行っているのは、一時オブジェクトの作成です。これを実行しようとすると、コンパイラはエラーを報告します-> multi(5,5)。

于 2013-01-18T15:46:38.270 に答える