在成员函数中调用类构造函数
Calling Class Constructor in Member Function
这是一个程序,我试图在函数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
类的成员函数,它可以访问私有成员,所以它可以直接设置a
和b
。您可以通过像这样重写multiply
来获得预期的输出:
void multiply()
{
cout << "nn" << a*b;
b = 5;
cout << "n" << a*b;
}
不能这样调用构造函数。您的代码所做的是创建一个新的multi
临时实例,该实例将立即被丢弃。
对象一旦被构造,就不能再调用它的构造函数。在类中创建一个assign()
函数或类似的函数
不能调用已经创建的对象的构造函数。您在代码中所做的是创建一个临时对象。编译器将报告错误,如果你尝试做——>多(5,5)。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用