use*_*913 3 c++ constructor arguments
我在c ++中有以下类
class MyClass {
public:
bool flag;
MyClass (bool flag = false) {
this->flag = flag;
}
...
};
Run Code Online (Sandbox Code Playgroud)
在我的主要(用于测试)我有类似的东西
int main() {
MyClass number1 = MyClass(true);
MyClass number2 = MyClass(false);
MyClass number3 = new MyClass(false);
MyClass number4 = new MyClass(true);
MyClass number5 = new MyClass();
std::cout << number1.flag << number2.flag << std::endl;
std::cout << number3.flag << number4. flag << number5.flag << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
和我的输出(想象布尔输出true或false,输出格式更好)
true, false
true, true, true
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用"new"关键字创建"MyClass"对象时,无论我做什么或不放入参数构造函数,它总是将flag变量设置为true.
它适用于不使用"new"但不使用"new"的构造函数.我知道在使用和不使用关键字new之间唯一真正的区别是,如果不使用它,则在堆栈上创建变量,否则在堆上创建变量.我认为这不会出现任何错误.
如果我希望它正常工作,需要改变什么?我在类中有其他方法可以成功修改flag变量,但初始化它不起作用.我也尝试使用成员初始化列表来构造变量,但这也不起作用.
谢谢你的帮助!
编辑:这是编译的代码.我有两个文件,Test.c ++和AbstractCell.h.AbstractCell是MyClass,当这段代码运行时输出"isAlive:1"
void test_abstract_2(){
AbstractCell one = new AbstractCell();
std::cout << std::endl << "isAlive: " << one.alive << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
返回的指针new被隐式转换为bool,然后传递给MyClass(bool).
换句话说,以下内容:
MyClass number3 = new MyClass(false);
Run Code Online (Sandbox Code Playgroud)
相当于:
MyClass number3(bool(new MyClass(false)));
Run Code Online (Sandbox Code Playgroud)
由于返回的指针new永远不为null,因此转换总是产生true,这是传递给number3构造函数的.新分配的指针被泄露.
你可能想说:
MyClass* number3 = new MyClass(false);
MyClass* number4 = new MyClass(true);
MyClass* number5 = new MyClass();
Run Code Online (Sandbox Code Playgroud)
(注意星号.)
如果您声明了构造函数,则不会遇到此问题explicit:
explicit MyClass (bool flag = false) {
this->flag = flag;
}
Run Code Online (Sandbox Code Playgroud)
代码将无法编译,这会立即告诉您有些不对劲.