Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现默认构造函数_C++_Constructor_Implementation - Fatal编程技术网

C++ 实现默认构造函数

C++ 实现默认构造函数,c++,constructor,implementation,C++,Constructor,Implementation,我正在尝试用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;

我正在尝试用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
,然后所有方法在对其进行操作之前都要检查它


这件事我不太确定。有“标准”的方法吗?

通常,默认构造函数会将您初始化为“默认”参考时间

如果您在内部使用
time\u t
,将其设置为
time\u t
0(,即1/1/1970)将是一个合理的选择,因为“0”值是常见的默认值

,在C++中不需要默认构造函数,可以有一个没有默认构造函数的类型,它需要一个有效的“时间”。C++中不需要默认的CtoR。如果你不知道它应该如何工作,很有可能你就不应该有这样的想法。如果你想要一个,最明显的事情可能是检索当前的日期和时间

编辑:如果您没有显式定义任何构造函数,那么编译器将为您生成一个默认构造函数和一个副本构造函数。这两者都不一定是一件特别糟糕的事情——如果您不确定数据应该如何初始化,那么这可能是完全合理的

就创建向量而言:不,您不必使用默认的ctor来将内容放入向量中。通常,默认的ctor用于初始化未分配任何值的项。例如,
std::向量x(10)
创建一个包含10个
DateTime
对象的向量,每个对象都用默认的ctor初始化。如果您没有(也不希望)默认的ctor,则可以传递
DateTime
的实例以用于初始化这些对象:

DateTime party_time(12, 31, 1999);
std::vector<DateTime> x(10, party_time);
DateTime聚会时间(1999年12月31日);
标准:向量x(10,第三方时间);

如果您不想要默认构造函数,可以声明一个私有的默认构造函数,这样就不能使用它。

拥有默认构造函数是可选的,但在某些情况下,它通常会使类的使用更容易。如果您不提供任何构造函数,那么编译器将为您生成一个默认构造函数,它相当于一个具有空初始值设定项列表和空函数体的构造函数

在实现默认构造函数时,通常最好使其尽可能高效,因为默认构造函数不会被使用或覆盖。例如,流:
T;标准:cin>>t
或创建一个固定的事物数组,以便以后重新分配
T arr[100]。因此,虽然让默认构造函数将
DateTime
设置为“now”似乎是显而易见的,但如果这涉及到系统调用或其他昂贵的操作来查找当前日期,通常最好不要对默认构造函数这样做

DateTime() : ticks(), days(), months() /*, ... */ {}
如果您根本没有构造函数,那么在许多情况下,值初始化会导致所有成员在任何情况下都被初始化,例如:

// 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
s仍然有一个定义良好且易于识别的值,用于调试和诊断目的


虽然可以初始化
布尔值,允许“延迟构造”,但我不推荐使用它。它为类设计的所有其余部分增加了大量开销,但收益可能很小。如果客户机希望使用非默认值操作
DateTime
,则应由客户机根据需要对其进行初始化。

按照我的理解,如果我没有指定默认值,编译器会为我创建一个,我理解这是一件坏事。但在某些情况下,需要默认构造函数。例如,如果你想有一个DateTime对象的向量。或者这只是在没有声明其他构造函数的情况下,默认与否?@Austin Hyde:不,如果你定义了自己的构造函数,编译器不会提供默认构造函数。@Austin:如果您不创建任何构造函数,编译器将创建默认构造函数,但如果您创建了一个构造函数,它将不会生成默认构造函数。除非您定义了任何构造函数,否则编译器不会生成默认构造函数。因此,这只有在不需要构造函数的情况下才有用。我无法想象你为什么要这么做。但是,该技术对于复制构造函数和复制赋值运算符来说很有用,可以强制对象不可复制。@弗雷德·拉森:将构造函数设为私有是用于创建单例和静态工厂方法的主要技术。