【问题标题】:How to set a default constructor when there's more than one当有多个时如何设置默认构造函数
【发布时间】:2013-11-26 15:28:29
【问题描述】:

我正在学习 C++ 中的构造函数,并且我知道您可以声明多个构造函数。您可以在下面看到我下面有 2 个 Date 构造函数,但我想将 Date(long) 设置为默认构造函数。有人可以解释一下我会怎么做吗?

好吧,显然上面的问题很有意义。我正在解决书中的一个问题,这就是它所说的:

修改程序 10.3,使该类的唯一数据成员是一个名为 yyyymmdd 的长整数。通过替换声明 long yyyymmdd 来做到这一点;对于这些现有声明:

int 月份; 整数天; 整数年;

使用当前在类声明部分中声明的相同构造函数原型,重写它们,使 Date(long) 方法成为默认构造函数,而 Date(int, int, int) 方法转换月、日和年转换为类数据成员的正确格式。

计划 10.3:

#include <iostream>
#include <iomanip>
using namespace std;

class Date
{
    private:
        int month, day, year;
    public:
        Date(int=7, int=4, int=2012);
        Date(long);
        void showDate();
};

Date::Date(int mm, int dd, int yyyy)
{
   month = mm;
   day = dd;
   year = yyyy;
}

Date::Date(long yyyymmdd)
{
    year = int(yyyymmdd/10000);
    month = int( (yyyymmdd - year*10000)/100);
    day = int(yyyymmdd - year*10000 - month*100);
}

void Date::showDate()
{
    cout << "The date is "
         << setfill('0')
         << setw(2) << month << '/'
         << setw(2) << day << '/'
         << setw(2) << year % 100;
    cout << endl;
}

int main()
{
    Date a;
    Date b(4,1,1998);
    Date c = Date(20090515L);

    a.showDate();
    b.showDate();
    c.showDate();
    return 0;
}

【问题讨论】:

  • 什么是默认构造函数?
  • 这没有意义。编译器根据您提供的参数选择要调用的构造函数。指定“默认构造函数”会做什么?
  • 最多可以有一个不带必需参数的构造函数,包括在那个池中带all可选参数的构造函数。从字面上看,您的要求毫无意义。您通过满足该要求一次来选择哪个是“默认”。
  • 默认构造函数是没有参数的构造函数。看到这个答案。 stackoverflow.com/a/4836611/651848
  • @rkyser 没有参数的构造函数和需要没有参数的构造函数是有区别的。后者不代表前者,但前者肯定符合后者。

标签: c++ class constructor


【解决方案1】:

您拥有的月/日/年构造函数的默认值使其成为默认构造函数(您可以不带参数调用它。您要做的是取消默认这些并将参数默认为long 构造函数:

    Date(int, int, int);
    Date(long = 20120704);

【讨论】:

  • 谢谢马克。这一次我实际上陈述了我正在工作的书中的直接问题。这会改变你的答案吗?
【解决方案2】:

您不能设置默认构造函数。根据定义,默认构造函数是可以不带参数调用的构造函数。

如果您在创建对象时不(或不能)指定参数,则会自动使用它。

例如,如果您定义了一个对象数组,所有这些对象都将使用默认构造函数构造

Date dates[5]; // Will create 5 Dates using Date::Date(7, 4, 2012)

【讨论】:

  • 谢谢@king_nak。这一次我实际上陈述了我正在工作的书中的直接问题。这会改变你的答案吗?
  • 嗯,那么 Mark B 的回答是正确的。构造函数必须可以在没有参数的情况下调用。这意味着long-c'tor 必须具有默认参数。 注意:不带参数的可调用并不一定意味着不能带参数;它只需要所有参数的默认参数!
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多