在成员函数中调用类构造函数

时间:2013-01-18 15:28:10

标签: c++ function constructor

这是一个程序,我试图在函数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;
}

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

当您调用构造函数multi(5, 5)时,您实际上正在创建一个立即被破坏的临时对象。

答案 2 :(得分:0)

这不起作用,因为multi(5, 5);创建了一个类multi的临时对象,它立即被销毁,因为它不用于任何东西

由于multiply()是类multi的成员函数,因此它可以访问私有成员,因此可以直接设置ab。您可以通过重写multiply来获得预期的输出:

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

答案 3 :(得分:0)

你不能这样调用构造函数。您的代码所做的是创建一个multi的新临时实例,该实例会立即被丢弃。

构造对象后,无法再次调用其构造函数。在班上创建一个assign()函数或类似函数。

答案 4 :(得分:0)

您无法调用已创建对象的构造函数。你在代码中做的是创建一个临时对象。 如果您尝试这样做,编译器将报告错误 这 - &GT;多(5,5)