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

Calling Class Constructor in Member Function

本文关键字:构造函数 调用 成员 函数      更新时间:2023-10-16

这是一个程序,我试图在函数void multi::multiply()中调用类构造函数multi::multi(int, int)。输出为

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 << "nn" << a*b;
            multi (5, 5);
            cout << "n" << a*b;
        }
};
main(){
    multi x(5,6);
    x.multiply();
return 0;
}
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 << "nn" << a*b;
            reset(5, 5);  //<-------------- note this
            cout << "n" << a*b;
        }
};

顺便说一下,在定义构造函数时更喜欢使用member-initialization-list。

当你调用构造函数multi(5, 5)时,你实际上是在创建一个临时对象,该对象将立即被销毁。

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

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

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

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

对象一旦被构造,就不能再调用它的构造函数。在类中创建一个assign()函数或类似的函数

不能调用已经创建的对象的构造函数。您在代码中所做的是创建一个临时对象。编译器将报告错误,如果你尝试做——>多(5,5)。