C ++一个参数布尔构造函数和“new”关键字:逻辑错误

时间:2012-11-27 21:13:51

标签: c++ constructor arguments

我在c ++中有以下类

class MyClass {

public:
  bool flag;

  MyClass (bool flag = false) {
    this->flag = flag;
  }
...
};

在我的主要(用于测试)我有类似的东西

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;
}

我的输出(想象布尔输出为true或false,输出格式更好)

true, false 
true, true, true

问题是,当我使用“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;

  }

2 个答案:

答案 0 :(得分:7)

new返回的指针会隐式转换为bool,然后传递给MyClass(bool)

换句话说,以下内容:

MyClass number3 = new MyClass(false);

相当于:

MyClass number3(bool(new MyClass(false)));

由于new返回的指针永远不为null,因此转换总是产生true,这是传递给number3构造函数的内容。新分配的指针被泄露。

你可能想说:

 MyClass* number3 = new MyClass(false);
 MyClass* number4 = new MyClass(true);
 MyClass* number5 = new MyClass();

(注意星号。)

如果您声明构造函数explicit

,则不会遇到此问题
  explicit MyClass (bool flag = false) {
    this->flag = flag;
  }

代码将无法编译,这会立即告诉您有些不对劲。

答案 1 :(得分:0)

你有两个问题:

第一个是new返回指针,而不是静态对象。你通常这样使用它:

MyClass* number3 = new MyClass(false);
std::cout<<std::boolalpha<<number3->flag<<std::endl;  //outputs 'false'
...  //do more stuff with number3
delete number3;

第二个问题是代码编写为编写。 编辑:我认为代码通常不应该像编写的那样编译,但我认为我错了。似乎有很多东西可以在C ++中隐式转换为bool。

所以我会修改它并说第二个问题是代码通过构造匿名的临时动态对象来泄漏内存,这些对象不会被破坏:)