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;
        }
};

顺便说一句,在定义构造函数时更喜欢使用成员初始化列表。

于 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,它可以访问私有成员,所以它可以直接a设置b。您可以通过如下重写来获得预期的输出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 回答