类型转换构造函数求解

fxfxfxfxw 2016-03-17 01:02:45
#include<iostream>
using namespace std;
class Date
{
public:
Date(int _year = 1900, int _month = 1, int _day = 1)
{
year = _year;
month = _month;
day = _day;
}
void Show()
{
cout << year <<"/"<< month <<"/"<<day << endl;
}
int Getyear()
{
return year;
}
int Getmonth()
{
return month;
}
int Getday()
{
return day;
}
void setyear(int _year)
{
year = _year;
}
void setmonth(int _month)
{
month = _month;
}
void setday(int _day)
{
day = _day;
}
private:
int year,month,day;

};
class Time
{
public:
Time(int _hour = 0, int _minute = 0, int _second = 0)
{
hour= _hour;
minute = _minute;
second = _second;
}
Time(int x)//转换构造函数
{
minute = x/ 60;
hour = x / 60;
second = x - hour * 60 * 60 - minute * 60;
}
void Show()
{
cout << hour << ":" << minute << ":" << second << endl;
}
int Gethour()
{
return hour;
}
int Getminute()
{
return minute;
}
int Getsecond()
{
return second;
}
void sethour(int _hour)
{
hour = _hour;
}
void setminute(int _minute)
{
minute = _minute;
}
void setsecond(int _second)
{
second = _second;
}
private:
int hour, minute, second;
};
class DateTime
{
public:
DateTime(Date _d, Time _t)//形参为类的构造函数
{
d = _d;
t = _t;
}
DateTime(int year=1900,int month=1,int day=1,int hour=0,int minute=0,int second=0)
{
d.setyear(year);
d.setmonth(month);
d.setday(day);
t.sethour(hour);
t.setminute(minute);
t.setsecond(second);
}
void Show()
{
cout << d.Getyear() << "/" << d.Getmonth()<< "/" << d.Getday()<< " " << t.Gethour()<< ":" << t.Getminute()<< ":" << t.Getsecond()<<endl;
}
void AddSecond();
private:
Date d;
Time t;
};
void DateTime::AddSecond()
{
int year, month, day, hour, minute, second;
year = d.Getyear();
month = d.Getmonth();
day = d.Getday();
hour = t.Gethour();
minute = t.Getminute();
second = t.Getsecond();
second++;
if (second == 60) //时间
{
second = 0;
minute++;
if (minute == 60)

{
minute = 0;
hour++;
if (hour == 24)
{
hour = 0;
day++;
}
}
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) //每月有31天的
{
if (day == 31 + 1)
{
day = 1;
month++;
}
}
if (month == 4 || month == 6 || month == 9 || month == 11)//每月有30天的
{
if (day == 30 + 1)
{
day = 1;
month++;
}
}
if (month == 2)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //闰年
{
if (day == 29 + 1)
{
day = 1;
month++;
}
}
else //平年
{
if (day == 28 + 1)

{
day = 1;
month++;
}
}
}
if (month == 13)
{
month = 1;
}
d.setyear(year);
d.setmonth(month);
d.setday(day);
t.sethour(hour);
t.setminute(minute);
t.setsecond(second);
}
void main()
{
Date d(2016, 2, 29);
d.Show(); //显示:2016/02/29

Time t(23, 59, 59);
t.Show(); //显示:23:59:59

DateTime dt1(d, t);
dt1.Show(); //显示:2016/02/29 23:59:59
dt1.AddSecond(); //dt1的值改为增加1秒后的日期时间
dt1.Show(); //显示:2016/03/01 00:00:00

DateTime dt2; //默认构造函数
dt2.Show(); //显示:1900/01/01 00:00:00

DateTime dt3(1998, 3, 18, 13, 30, 0); //带参数构造函数
dt3.Show(); //显示:1998/03/18 13:30:00
t=1234; //类型转换,t得到一天中第1234秒的时间
t.Show(); //显示: 00:20:34
}

其他功能正常,请问为什么最后的t=1234的类型转就不行
...全文
168 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
renwotao2009 2016-03-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_30265137 的回复:
[quote=引用 3 楼 sdghchj 的回复:] Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
那请问下列代码为何能执行,很疑惑,谢谢解答
#include
using namespace std;
class Fract
{
public:
 Fract()
 {
  den=0;
  num=1;
 }
 Fract(int n)
 {
  den = n;
  num = 1;
 }
 Fract(int den,int num)
 {
  this->den = den;
  this->num = num;
 }
 void Show()
 {
  cout<< this->den <<"/"<<this->num<<endl;
 }
private:
 int den; //fenzi
 int num; //fenmu
};
void main()
{
 Fract f1(5),f2(1,3),f3;
 f1.Show();
 f1 = 7;           //类型转换
 f1.Show();
}
[/quote] String a = "1232423"; == String a= String("1232423");
sdghchj 2016-03-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_30265137 的回复:
[quote=引用 3 楼 sdghchj 的回复:] Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
那请问下列代码为何能执行,很疑惑,谢谢解答
#include
using namespace std;
class Fract
{
public:
 Fract()
 {
  den=0;
  num=1;
 }
 Fract(int n)
 {
  den = n;
  num = 1;
 }
 Fract(int den,int num)
 {
  this->den = den;
  this->num = num;
 }
 void Show()
 {
  cout<< this->den <<"/"<<this->num<<endl;
 }
private:
 int den; //fenzi
 int num; //fenmu
};
void main()
{
 Fract f1(5),f2(1,3),f3;
 f1.Show();
 f1 = 7;           //类型转换
 f1.Show();
}
[/quote] 嗯,编译器会自动7调用构造函数Fract(int)构造一个临时变量后再赋值给f1,即f1=Fract(7); 前面那代码应该也是 Time t; t=1234; //本来也会自动变为t=Time(1234)的,但由于Time(int _hour = 0, int _minute = 0, int _second = 0)和Time(int)两个构造函数都可以选,所以编译器不知道选哪个构造函数,于是就只能去找=操作符了,但=操作符又没重载就报错了。
fefe82 2016-03-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_30265137 的回复:
[quote=引用 3 楼 sdghchj 的回复:] Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
那请问下列代码为何能执行,很疑惑,谢谢解答
#include
using namespace std;
class Fract
{
public:
 Fract()
 {
  den=0;
  num=1;
 }
 Fract(int n)
 {
  den = n;
  num = 1;
 }
 Fract(int den,int num)
 {
  this->den = den;
  this->num = num;
 }
 void Show()
 {
  cout<< this->den <<"/"<<this->num<<endl;
 }
private:
 int den; //fenzi
 int num; //fenmu
};
void main()
{
 Fract f1(5),f2(1,3),f3;
 f1.Show();
 f1 = 7;           //类型转换
 f1.Show();
}
[/quote] 先类型转换,再拷贝赋值。 拷贝赋值的 operator = 编译通常会自动生成一个。
fefe82 2016-03-17
  • 打赏
  • 举报
回复
引用 楼主 qq_30265137 的回复:
#include<iostream>
using namespace std;
class Date
{
public:
	Date(int _year = 1900, int _month = 1, int _day = 1)
	{
		year = _year;
		month = _month;
		day = _day;
	}
	void Show()
	{
		cout << year <<"/"<< month <<"/"<<day << endl;
	}
	int Getyear()
	{
		return year;
	}
	int Getmonth()
	{
		return month;
	}
	int Getday()
	{
		return day;
	}
	void setyear(int _year)
	{
		year = _year;
	}
	void setmonth(int _month)
	{
		month = _month;
	}
	void setday(int _day)
	{
		day = _day;
	}
private:
	int year,month,day;
	
};
class Time
{
public:
	Time(int _hour = 0, int _minute = 0, int _second = 0)
	{
		hour= _hour;
		minute = _minute;
		second = _second;
	}
	Time(int x)//转换构造函数
	{
		minute = x/ 60;
		hour = x / 60;
		second = x - hour * 60 * 60 - minute * 60;
	}
	void Show()
	{
		cout << hour << ":" << minute << ":" << second << endl;
	}
	int Gethour()
	{
		return hour;
	}
	int Getminute()
	{
		return minute;
	}
	int Getsecond()
	{
		return second;
	}
	void sethour(int _hour)
	{
		hour = _hour;
	}
	void setminute(int _minute)
	{
		minute = _minute;
	}
	void setsecond(int _second)
	{
		second = _second;
	}
private:
	int hour, minute, second;
};
class DateTime
{
public:
	DateTime(Date _d, Time _t)//形参为类的构造函数
	{
		d = _d;
		t = _t;
	}
	DateTime(int year=1900,int month=1,int day=1,int hour=0,int minute=0,int second=0)
	{
		d.setyear(year);
		d.setmonth(month);
		d.setday(day);
		t.sethour(hour);
		t.setminute(minute);
		t.setsecond(second);
	}
	void Show()
	{
		cout << d.Getyear() << "/" << d.Getmonth()<< "/" << d.Getday()<< " " << t.Gethour()<< ":" << t.Getminute()<< ":" << t.Getsecond()<<endl;
	}
	void AddSecond();
private:
	Date d;
	Time t;
};
void DateTime::AddSecond()       
{
	int year, month, day, hour, minute, second;
	year = d.Getyear();
	month = d.Getmonth();
	day = d.Getday();
	hour = t.Gethour();
	minute = t.Getminute();
	second = t.Getsecond();
	second++;
	if (second == 60)        //时间
	{
		second = 0;
		minute++;
		if (minute == 60)

		{
			minute = 0;
			hour++;
			if (hour == 24)
			{
				hour = 0;
				day++;
			}
		}		
	}
	if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)   //每月有31天的
	{
		if (day == 31 + 1)
		{
			day = 1;
			month++;
		}
	}
	if (month == 4 || month == 6 || month == 9 || month == 11)//每月有30天的
	{
		if (day == 30 + 1)
		{
			day = 1;
			month++;
		}
	}
	if (month == 2)
	{
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)     //闰年
		{
			if (day == 29 + 1)
			{
				day = 1;
				month++;
			}
		}
		else                                      //平年
		{
			if (day == 28 + 1)

			{
				day = 1;
				month++;
			}
		}
	}
	if (month == 13)
	{
		month = 1;
	}
	d.setyear(year);
	d.setmonth(month);
	d.setday(day);
	t.sethour(hour);
	t.setminute(minute);
	t.setsecond(second);
}
void main()
{
	Date d(2016, 2, 29);
	d.Show();         //显示:2016/02/29

	Time t(23, 59, 59);
	t.Show();          //显示:23:59:59

	DateTime dt1(d, t);
	dt1.Show();        //显示:2016/02/29 23:59:59
	dt1.AddSecond();       //dt1的值改为增加1秒后的日期时间
	dt1.Show();                  //显示:2016/03/01 00:00:00

	DateTime dt2;            //默认构造函数
	dt2.Show();     //显示:1900/01/01 00:00:00

	DateTime dt3(1998, 3, 18, 13, 30, 0);   //带参数构造函数
	dt3.Show();                //显示:1998/03/18 13:30:00
	t=1234;    //类型转换,t得到一天中第1234秒的时间
	t.Show();               //显示: 00:20:34
}
其他功能正常,请问为什么最后的t=1234的类型转就不行
Time 有两个不同的构造函数可以接受一个 int 为参数: Time(int _hour = 0, int _minute = 0, int _second = 0) Time(int x)//转换构造函数 失败时由于 ambiguity 。不能决定调用那个一个构造。 ======== 另外这里在调用构造之后,还对调用 operator = (const Time &) 。拷贝赋值函数没有定义的话经常会自动生成一个。
paschen 版主 2016-03-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_30265137 的回复:
[quote=引用 3 楼 sdghchj 的回复:] Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
那请问下列代码为何能执行,很疑惑,谢谢解答
#include
using namespace std;
class Fract
{
public:
 Fract()
 {
  den=0;
  num=1;
 }
 Fract(int n)
 {
  den = n;
  num = 1;
 }
 Fract(int den,int num)
 {
  this->den = den;
  this->num = num;
 }
 void Show()
 {
  cout<< this->den <<"/"<<this->num<<endl;
 }
private:
 int den; //fenzi
 int num; //fenmu
};
void main()
{
 Fract f1(5),f2(1,3),f3;
 f1.Show();
 f1 = 7;           //类型转换
 f1.Show();
}
[/quote] 那你把 Time(int _hour = 0, int _minute = 0, int _second = 0) 改成 Time(int _hour, int _minute, int _second) 否则单你只有一个参数的时候,他不知道是调用Time(int _hour = 0, int _minute = 0, int _second = 0),还是调用Time(int x)
fxfxfxfxw 2016-03-17
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
那请问下列代码为何能执行,很疑惑,谢谢解答
#include
using namespace std;
class Fract
{
public:
 Fract()
 {
  den=0;
  num=1;
 }
 Fract(int n)
 {
  den = n;
  num = 1;
 }
 Fract(int den,int num)
 {
  this->den = den;
  this->num = num;
 }
 void Show()
 {
  cout<< this->den <<"/"<<this->num<<endl;
 }
private:
 int den; //fenzi
 int num; //fenmu
};
void main()
{
 Fract f1(5),f2(1,3),f3;
 f1.Show();
 f1 = 7;           //类型转换
 f1.Show();
}
sdghchj 2016-03-17
  • 打赏
  • 举报
回复
Time t(23, 59, 59); t=1234; //t在上面已经声明并初始化了,此句就是赋值,调用的是=操作符,需要重载Time& operator=(int a)。 而如果是Time t=1234或者Time t(1234),就调用的是Time(int )构造函数了。
iyomumx 2016-03-17
  • 打赏
  • 举报
回复
转换构造函数有问题,hour和minute是一样的。 另外,既然封装成类,那就应该进行合规性检查——要么在set的时候检查并且保证任何时候都使用setter和getter来访问成员,要么提供一个方法以调整各个成员的值到合法范围内。
paschen 版主 2016-03-17
  • 打赏
  • 举报
回复
你得在 Time类中重载 = 运算符, Time& operator=(int a)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧