这是一个程序,我试图在函数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;
}
答案 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
的成员函数,因此它可以访问私有成员,因此可以直接设置a
和b
。您可以通过重写multiply
来获得预期的输出:
void multiply()
{
cout << "\n\n" << a*b;
b = 5;
cout << "\n" << a*b;
}
答案 3 :(得分:0)
你不能这样调用构造函数。您的代码所做的是创建一个multi
的新临时实例,该实例会立即被丢弃。
构造对象后,无法再次调用其构造函数。在班上创建一个assign()
函数或类似函数。
答案 4 :(得分:0)
您无法调用已创建对象的构造函数。你在代码中做的是创建一个临时对象。 如果您尝试这样做,编译器将报告错误 这 - &GT;多(5,5)