我想运行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)
......有人试图解释我为什么做错了,或者没有用,或者是愚蠢的或者你有什么?我的意思是 - 在心理上,我只是想 - 废话,我可以调用这个构造函数并重新初始化所有这些东西.构造函数(理想情况下)是否仅在创建对象时调用?
你的行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类型的对象.据推测,在您的实际代码中,构造函数有一个或多个参数.
那行阅读会发生什么......
Class ();
Run Code Online (Sandbox Code Playgroud)
你实际上是在调用构造函数吗 - 对于一个从头开始构造的临时对象,然后由于你没有对它做任何事情而立即被破坏.它非常类似于转换为Class,它使用构造函数调用创建一个值,除了在这种情况下没有要转换的值,因此使用默认构造函数.
然后编译器可能会将此临时优化掉,因此根本没有构造函数 - 我不确定是否允许这样做.
如果要重新初始化成员,则调用构造函数不是这样做的方法.将所有初始化代码移动到另一个方法中并从构造函数中调用它,并且当您想要重新初始化时.