这两个为什么错了:Date(long ndays=0); ① //转换构造函数 ~Date(){delete *this}
时间: 2024-03-29 18:38:40 浏览: 11
这两个函数都存在错误。首先,构造函数的错误在于它没有正确地初始化对象的成员变量,而是直接将一个天数转换成了对应的日期。其次,它还缺少一个关键字,应该是这样的:`Date(long ndays = 0) : member1(value1), member2(value2), ... {}`,其中member1、member2等是对象的成员变量,value1、value2等是它们的初始值。这样才能正确地构造一个对象。
而析构函数的错误在于它使用了`delete *this`这样的语句,这实际上是在试图删除一个指向自身的指针,这是不合法的行为。正确的做法应该是将析构函数定义为`~Date() {}`,这样对象在被销毁时,成员变量会自动被销毁,而不需要手动删除它们。
相关问题
Date() { yr = mo = day = 1; cout << "调用默认构造函数" << endl; } //默认构造函数 Date(int y, int m, int d) { yr = y; mo = m; day = d; cout << "调用构造函数" << endl; } //构造函数 Date(long ndays); //① //转换构造函数 ~Date() { delete* this; } //② //析构函数这个析构函数如何修改
这个析构函数中的 delete 操作是不正确的,因为 this 是一个指向对象的指针,而不是指向对象的指针数组。因此,需要将 delete 操作改为 delete this,以释放对象本身的内存。另外,这个析构函数的语义是删除 Date 对象,因此应该将其改为普通的析构函数。以下是一个可能的修改:
```c++
~Date() { cout << "调用析构函数" << endl; }
```
在这个修改后的析构函数中,我们只是简单地输出一条消息,表示该对象已经被销毁。如果您想要在对象被销毁时执行一些其他操作,可以在析构函数中添加相应的代码。
解释代码:long operator char*()const; ③ //成员转换函数 { long ndays=0; //步骤1) for(int i=1;i<yr;++i) //步骤2) ndays+=Leapyear(i)?366:365; for(i=1;i<mo;++i) //步骤3) ndays+=dys[i-1]; if(mo>2&&Leapyear(yr)) //闰年闰月加一天 ++ndays; ndays+=day; //步骤4) return ndays; //步骤5) }
这是一个日期类中的类型转换函数,将日期对象转换为一个长整型数值表示日期到1900年1月1日的天数。具体步骤如下:
1. 初始化变量ndays,表示天数为0。
2. 循环计算当前年份之前的所有年份的天数,如果该年是闰年,则加上366天,否则加上365天。
3. 循环计算当前月份之前的所有月份的天数,根据数组dys中存储的每个月的天数进行累加。
4. 如果当前年份是闰年并且当前月份大于2,则当前天数加1。
5. 最后加上当前天数,返回总天数ndays。
需要注意的是,该函数没有参数,因此需要在调用时使用对象名作为参数。例如:
```c++
Date d(2021, 10, 1);
long days = static_cast<long>(d); // 调用类型转换函数,将日期对象转换为天数
cout << "Days since 1900/1/1: " << days << endl; // 输出结果:Days since 1900/1/1: 44423
```