调用构造函数重新初始化变量似乎不起作用?

Azo*_*reo 6 c++ constructor

我想运行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
 */
}
Run Code Online (Sandbox Code Playgroud)

......有人试图解释我为什么做错了,或者没有用,或者是愚蠢的或者你有什么?我的意思是 - 在心理上,我只是想 - 废话,我可以调用这个构造函数并重新初始化所有这些东西.构造函数(理想情况下)是否仅在创建对象时调用?

Ste*_*sop 8

你的行Class();确实调用了类的构造函数Class,但它调用它来创建一个"临时对象".由于您不使用该临时对象,因此该行没有任何有用的效果.

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

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

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

myObject = Class();
Run Code Online (Sandbox Code Playgroud)

myObject将使用新构建的临时值进行更新.它不一定是最有效的可能代码,因为它创建一个临时的,然后复制,然后销毁临时,而不是仅仅将字段设置为其初始值.但是,除非你的班级很庞大,否则千万次这样做不太可能需要花费相当多的时间.

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

int main() {
    int counter = 0;
    while (counter < 1000) {
        Class myObject;
        // stuff happens, each iteration has a brand new object
    }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是Class MyClass();限定类型类的一个对象,称为MyClass的,并且不带参数构造它.它声明了一个名为MyClass的函数,该函数不带参数,并返回Class类型的对象.据推测,在您的实际代码中,构造函数有一个或多个参数.


Ste*_*314 5

那行阅读会发生什么......

Class ();
Run Code Online (Sandbox Code Playgroud)

你实际上是在调用构造函数吗 - 对于一个从头开始构造的临时对象,然后由于你没有对它做任何事情而立即被破坏.它非常类似于转换为Class,它使用构造函数调用创建一个值,除了在这种情况下没有要转换的值,因此使用默认构造函数.

然后编译器可能会将此临时优化掉,因此根本没有构造函数 - 我不确定是否允许这样做.

如果要重新初始化成员,则调用构造函数不是这样做的方法.将所有初始化代码移动到另一个方法中并从构造函数中调用它,并且当您想要重新初始化时.

  • "我不确定这是否允许" - 它是,但只有当构造函数和析构函数都没有对程序的可观察行为产生任何影响时.因此,如果您进行一些跟踪以查看它们是否被省略,则不能省略它们. (2认同)