我想运行一个程序的 1,000 次迭代,因此在 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
*/
}
...有人可以解释为什么我做的是错的,或者没有用,或者是愚蠢的,或者你有什么?我的意思是 - 在精神上,我只是想 - 废话,我可以调用这个构造函数并重新初始化所有这些东西。构造函数(理想情况下)仅在创建对象时调用吗?
最佳答案
您的行 Class();
确实调用了类 Class
的构造函数,但它调用它是为了创建一个“临时对象”。由于您不使用该临时对象,因此该行没有任何用处。
临时对象(通常)在它们出现的表达式末尾消失。它们对于作为函数参数传递或初始化其他对象很有用。仅仅在一个语句中创建一个几乎是没有用的。该语言允许它作为一个有效的表达式,只是对于大多数类来说它并没有做太多。
在 C++ 中,无法对已构造的对象调用构造函数。 C++ 对象的生命周期是一次构造,一次破坏。这就是它的工作原理。如果你想在它的生命周期中重置一个对象,你做对了,那就是调用一个函数来重置它。根据您的类(class),您可能不需要编写一个 - 默认赋值运算符可能会完全满足您的需要。这时候临时工就可以派上用场了:
Class myObject;
// ... do some stuff to myObject ...
myObject = Class();
这会用新构建的临时对象的值更新 myObject
。它不一定是最有效的代码,因为它创建一个临时文件,然后复制,然后销毁临时文件,而不是仅仅将字段设置为它们的初始值。但是,除非您的类(class)很大,否则完成 1000 次所有操作不太可能花费大量时间。
另一种选择是每次迭代都使用一个全新的对象:
int main() {
int counter = 0;
while (counter < 1000) {
Class myObject;
// stuff happens, each iteration has a brand new object
}
}
请注意,Class MyClass();
不定义一个名为 MyClass 的 Class 类型的对象,并在不带参数的情况下构造它。它声明了一个名为 MyClass 的函数,该函数不接受任何参数并返回一个 Class 类型的对象。假设在您的真实代码中,构造函数具有一个或多个参数。
关于c++ - 调用构造函数重新初始化变量似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2530842/