运算符和构造函数

时间:2012-07-17 11:01:38

标签: c++

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

该类有一组核心成员,我在上面的所有成员中都有一组“状态变量”,我作为一些方法的帮助者添加了这些成员。

这些状态变量永远不会(只是因为我不打扰它)在构造函数中初始化但在使用之前被初始化。

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

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

干杯 安德烈

3 个答案:

答案 0 :(得分: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它在对它进行计算之前处于有效状态

答案 1 :(得分:1)

从c ++的角度来看,这里没有任何错误,但是c ++并不能保护你不会在脚下射击。在几个月内,您可能正在调试仅在发布版本中发生的错误,然后您将花几天时间找出发生这种情况的原因。有很多问题为什么我的应用程序在Release中运行但在Debug中没有,其中一个原因是调试堆初始化已分配的内存。

答案 2 :(得分:1)

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

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

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

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

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

相关问题