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

标签 c++ constructor

我想运行一个程序的 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/

相关文章:

c++ - 未从 Qt dll 检索对象成员

c++ - 关于在 C++ 中将默认构造函数分配给 *this 的问题?

Angular:在窗口上的事件监听器中引用当前组件

c++ - 对 vector 中的值求平方

c++ - 执行覆盖的继承函数

c++ - 使与 IPv6 或 IPv4 的连接变得容易?

C++:如何创建两个相互依赖的共享库?

data-binding - MVVM 在 ViewModel 构建期间或之后加载数据?

c++ - 从构造函数调用虚函数和纯虚函数

javascript - 使用空函数作为继承的构造函数会混淆 javascript 中的 instanceof?