1

我有一个类,我在其中实现了自己的构造函数、析构函数、复制构造函数和复制赋值运算符。

该类有一组核心成员,我在上述所有内容中都有,还有一组“状态变量”,我添加为一些方法的助手。

这些状态变量永远不会(只是因为我没有费心去做)在构造函数中初始化,而是在使用之前初始化。

因此,复制构造函数和复制赋值对它们没有任何作用。他们只是复制我明确想要的成员。

  • 这会是个问题吗?
  • 没有显式复制的成员会发生什么(顺便说一句,这些成员中没有指针)?
    • 它们也没有在构造函数中初始化
  • 这会导致任何“隐藏”的问题吗?

干杯安德烈

4

3 回答 3

3

Can this be a problem?

- 如果您在使用前初始化它们并且不要忘记释放(在指针的情况下),我看不到任何问题。

What happens to members that aren't explicitly copied (btw, no pointers in these members)? they are also not initialized in the constructor

- 他们拿着垃圾

Can this lead to any "hidden" problems?

-不,如果你小心的话

但我建议您无论如何都在构造函数中初始化它们,因为这样更容易捕获错误,并且使您的对象始终保持完整状态。例如,捕获nullptr指针比捕获垃圾指针或指向已释放对象的指针要容易得多。因为在第一种情况下程序只会崩溃(取消引用空指针是 UB,但通常它只是崩溃)

如果可能的话,我更愿意创建局部变量来存储中间结果。如果它不是单个方法的中间结果 - 那么它可能是一个坑,如果在初始化之前在其他方法中使用此变量,您可能会跌倒。在这种情况下,最好存储零初始化变量 - 这样您就可以assert在对其进行计算之前使其处于有效状态

于 2012-07-17T11:07:13.223 回答
1

如果这些变量是对象状态的一部分,那么它们应该被复制。如果变量不是对象状态的一部分,它们不应该是成员。如果接口中任何函数的结果取决于操作开始之前该变量的值,则变量是对象状态的一部分。

上面的一般规则很少有例外,特别是有一些成员变量不参与对象的状态(它们通常标记为mutable)作为同步机制或复杂操作结果的缓存。

回到您的问题,从描述看来,您可能仅将这些成员用作不同成员函数之间的通信机制。接口中的一个函数设置值,然后调用读取/修改它们的其他函数。如果是这种情况,请考虑将变量作为参数传递给函数。通过使用成员,您可以有效地隐藏函数对这些值的依赖关系,同时向类添加依赖关系。

如果接口中的任何函数访问这些成员,情况会更糟,在这种情况下,在分配(或复制构造)之后,源和目标将表现不同,这打破了在复制初始化/分配之后源和目标的假设目标对象是等价的。

基本上,从实际的角度来看,如果这些成员不是对象状态的一部分,您可能会放弃当前的方法,但我真的会重新考虑设计。如果它们确实参与了对象的状态,你不应该以任何方式避免复制它们。

于 2012-07-17T12:43:40.887 回答
1

从 c++ 的角度来看,这里没有错,但 c++ 并不能保护您免于被自己的脚踢伤。几个月后,您可能会调试一个仅在发布版本中发生的错误,然后您将花费几天时间找出发生这种情况的原因。有很多问题为什么我的应用程序可以在 Release 中运行但不能在 Debug 中运行,原因之一是调试堆初始化了分配的内存。

于 2012-07-17T11:40:18.010 回答