C++ 调用构造函数重新初始化变量不会';好像不行?

C++ 调用构造函数重新初始化变量不会';好像不行?,c++,constructor,C++,Constructor,我想运行一个程序的1000次迭代,所以在main中为1000设置一个计数器。我需要在每次迭代后重新初始化各种变量,因为类构造函数已经写出了所有的初始化——我决定在每次迭代后调用它,每次迭代的结果都存储在main中的一个变量中 然而,当我调用构造函数时,它没有任何效果……我花了一段时间才弄明白——但它没有重新初始化任何东西 我创建了一个与构造函数完全相同的函数,因此对象将有自己的版本。当我调用它时,它按照我的预期重新初始化了所有内容 int main() { Class MyClass()

我想运行一个程序的1000次迭代,所以在main中为1000设置一个计数器。我需要在每次迭代后重新初始化各种变量,因为类构造函数已经写出了所有的初始化——我决定在每次迭代后调用它,每次迭代的结果都存储在main中的一个变量中

然而,当我调用构造函数时,它没有任何效果……我花了一段时间才弄明白——但它没有重新初始化任何东西

我创建了一个与构造函数完全相同的函数,因此对象将有自己的版本。当我调用它时,它按照我的预期重新初始化了所有内容

int main()
{
 Class MyClass()

 int counter = 0;

 while ( counter < 1000 )
 { stuff happens }

 Class(); // This is how I tried to call the constructor initially.
          // After doing some reading here, I tried:
          // Class::Class(); 
          // - but that didn't work either 
 /* Later I used...
 MyClass.function_like_my_constructor; // this worked perfectly
 */
}
intmain()
{
类MyClass()
int计数器=0;
同时(计数器<1000)
{事情发生了}
Class();//这就是我最初尝试调用构造函数的方式。
//在这里读了一些书之后,我试着:
//Class::Class();
//-但那也没用
/*后来我用。。。
MyClass.function\u类似于我的构造函数;//这非常有效
*/
}

…有人能解释一下为什么我做的是错的,或者不起作用,或者是愚蠢的,或者你做了什么吗?我的意思是-在精神上,我只是想-废话,我可以调用这个构造函数并重新初始化所有这些东西。构造函数(理想情况下)仅在创建对象时调用吗?

是的,这不是典型的用法。创建一个函数,它可以重置变量,并在需要时调用该方法。

< P>你会被C++的常见误读所困扰。新的c++0x使事情变得更加清晰

问题是构造语法看起来像函数调用

void foo( int i ) { }
class Foo { };

Foo(10); // construct a temporary object of type foo
foo(10); // call function foo
Foo{10}; // construct a temporary object of type foo in c++0x syntax
我认为c++0x语法更清晰

您可以使用此语法执行任何操作。但是要注意,它非常先进,你应该而不是这样做

MyClass.~Class(); // destruct MyClass
new( &MyClass ) Class;

在那一行中发生了什么

Class ();
事实上,您确实调用了构造函数——对于一个临时对象,它是从头开始构造的,然后会立即被破坏,因为您没有对它做任何操作。这非常类似于强制转换到类,它使用构造函数调用创建一个值,只是在本例中没有要强制转换的值,因此使用默认构造函数


编译器有可能会优化这个临时函数,所以根本没有构造函数——我不确定这是否被允许

如果要重新初始化成员,调用构造函数不是一种方法。将所有初始化代码移到另一个方法中,并从构造函数中调用该方法,而在需要重新初始化时调用该方法。

Class()
确实调用类的构造函数
,但它调用它是为了创建一个“临时对象”。由于不使用该临时对象,因此直线没有任何有用的效果

临时对象(通常)在其出现的表达式末尾消失。它们对于作为函数参数传递或初始化其他对象很有用。仅仅在语句中创建一个几乎没有用。语言允许它作为一个有效的表达式,只是对于大多数类来说它做的不多

< C++中没有办法在已经构建的对象上调用构造函数。C++对象的生命周期是一个结构,也是一个破坏。这就是它的工作原理。如果您想在对象的生命周期内重置对象,那么您已经做了正确的事情,即调用函数重置它。根据您的类,您可能不需要编写一个-默认赋值运算符可能会完全满足您的需要。这时,临时工就可以派上用场了:

Class myObject;
// ... do some stuff to myObject ...

myObject = Class();
这将使用新构造的临时对象的值更新
myObject
。它不一定是最有效的代码,因为它创建一个临时文件,然后复制,然后销毁临时文件,而不仅仅是将字段设置为初始值。但是,除非你的班级规模很大,否则完成1000次不太可能会花费大量的时间

另一种选择是在每次迭代中使用一个全新的对象:

int main() {
    int counter = 0;
    while (counter < 1000) {
        Class myObject;
        // stuff happens, each iteration has a brand new object
    }
}
intmain(){
int计数器=0;
同时(计数器<1000){
类myObject;
//事情发生了,每个迭代都有一个全新的对象
}
}

请注意,
classmyclass()不定义类型为Class(称为MyClass)的对象,并且不使用参数构造它。它声明了一个名为MyClass的函数,该函数不接受任何参数,并且返回一个Class类型的对象。大概在您的实际代码中,构造函数有一个或多个参数。

根据这些要求,我通常编写一个
clear()
(public)方法。我从构造函数,析构函数调用它。用户代码可以随时调用它

class Foo
{
  public:

    Foo() { clear(); }

    ~Foo() { clear(); }

    void clear(); // (re)initialize the private members

  private:

     // private members
 };

要回答这里的问题,只要需要重新初始化类,就可以调用
clear()
方法,就像初始构造之后一样。

“我不确定是否允许这样做”-是的,但前提是构造函数和析构函数都不对程序的可观察行为产生任何影响。所以,如果你加入一些跟踪来查看它们是否被省略,那么它们就不能被省略。我使用构造函数,但我很少传递参数,尽管我知道我可以。大多数时候,我只是觉得应该在源代码的构造函数中设置它们。为什么要通过main传递参数呢?在这种情况下,如果您没有使用构造函数参数,也没有使用无参数构造函数的正确语法,那么您的代码会编译,我感到非常惊讶。无论如何,使用构造函数参数的原因是如果类的对象不完全相同。看看标准库的例子,你可以指定向量的初始大小和内容等等。使用微软VisualStudioC++和内置编译器……如果我声明构造函数为KN