我正在尝试用C ++实现一个DateTime类:
class DateTime {
public:
DateTime();
DateTime(time_t ticks);
DateTime(int day, int month, int year);
DateTime(int day, int month, int year, int hour, int minute, int second);
//...
private:
time_t ticks;
int day;
int month;
//...
}
然后在申请中:
DateTime date1; //default constructor
我知道c ++需要一个默认的构造函数,但在这种情况下我该如何实现呢?
它应该将所有属性设置为0吗?这会使所有其他方法都有效,但看起来并不直观......
是否只是让所有属性都未初始化?这将使它的方法都不起作用,但它似乎比0更直观,因为你还没有做任何事情。
是否应该设置内部bool initialized=false
,那么所有方法在进行操作之前都会检查它?
我对这一点不太确定。这样做是否有“标准”方式?
答案 0 :(得分:9)
通常,默认构造函数会将您初始化为“默认”参考时间。
如果您在内部使用time_t
,将其设置为time_t
0(Unix epoch,即1/1/1970)将是一个合理的选项,因为“0 “值是常见的默认值。
话虽如此,C ++中不需要默认构造函数 - 您可以使用没有默认构造函数的类型,这需要指定有效的“时间”。
答案 1 :(得分:8)
C ++需要默认的ctor 。如果你不知道它应该如何工作,你很可能不应该有一个很好的机会。如果您打算使用一个,最明显的做法可能是检索当前的日期和时间。
编辑:如果您没有明确定义任何ctors,那么编译器将为您生成默认的ctor和copy ctor。两者都不是一件特别糟糕的事情 - 如果你不确定你的数据应该如何初始化,那么这可能是完全合理的。
就创建一个向量而言:不,你不必有一个默认的ctor来把东西放在一个向量中。通常,默认ctor用于初始化未分配任何值的项目。例如,std::vector<DateTime> x(10);
创建一个包含10个DateTime
个对象的向量,每个对象都使用默认的ctor进行初始化。如果您没有(并且不希望)默认ctor,则可以传递DateTime
的实例来用于初始化这些对象:
DateTime party_time(12, 31, 1999);
std::vector<DateTime> x(10, party_time);
答案 2 :(得分:1)
如果您不想使用默认构造函数,则可以声明私有默认构造函数,使其无法使用。
答案 3 :(得分:1)
拥有默认构造函数是可选的,但在某些情况下它通常会使您的类更容易使用。如果你不提供任何构造函数,那么编译器将为你生成一个默认构造函数,它相当于一个带有空初始化列表和空函数体的构造函数。
实现默认构造函数时,通常最好使其尽可能高效,因为不使用或覆盖默认构造函数。例如。流式传输:T t; std::cin >> t;
或创建一系列固定的事物,以便稍后重新分配T arr[100];
。出于这个原因,虽然使默认构造函数设置为DateTime
为“now”似乎是显而易见的,如果这涉及系统调用或其他昂贵的操作以找出当前日期,通常最好不要这样做对于默认构造函数。
如果你根本没有构造函数,那么很多情况下 value-initialization 会导致你的所有成员在任何情况下被初始化,例如:
// Explicit value-initialzation of dynamcially allocated DateTime
DateTime* pdt = new DateTime();
// Value-initialized temporary
FunctionTakesDateTime( DateTime() );
// Copy-initalization from a value-initialized temporary
DateTime dt = DateTime();
如果您提供了默认构造函数但未显式初始化该类的所有成员且这些成员属于POD类型(如time_t
和int
),那么这些成员现在将被保留初始化。要获得与值初始化相同的效果,就像没有用户声明的构造函数一样,您必须在默认构造函数中显式初始化所有成员。
DateTime() : ticks(), days(), months() /*, ... */ {}
这将是我首选的默认构造函数实现。这意味着默认构造仍然相当便宜,但默认构造DateTime
仍然具有良好定义且易于识别的值,用于调试和诊断目的。
虽然你可以拥有initialized
布尔值,允许你有“延迟构造”,但我不推荐它。它为所有其他类设计增加了很多开销,可能获得的收益很少。如果客户希望使用非默认值操作DateTime
,则应由客户端根据需要对其进行初始化。