顶着一头乱发的狮子

坚定的理想主义者.

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 0 文章 :: 14 评论 :: 0 Trackbacks

初学C++,这是一个构造函数重载的小小程序。int 造成了溢出,我到现在还不知道是怎么一回事?把红色标志的int去掉输入就正确了。WHY?
#include<iostream.h>
class date{

    int dayth;
public:
    date(int day);
    date(int day,int month);
    date(int day,int month,int year);
    int getdate();
};

date::date(int day){

dayth=day;

}

date::date(int day,int month){
    int i;
    int th[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dayth=0;
    for(i=0;i<month;i++)
    {dayth=dayth+th[i];}
    dayth=dayth+day;
}

date::date(int day,int month,int year){
    int i;
    int th[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dayth=0;

    if((year%4==0&&year%100!=0)||year%400==0)
 {

         for(i=0;i<month;i++)
         {dayth=dayth+th[i];}
         dayth=dayth+day;
         if(month>2)
         dayth=dayth+1;
 }
else{


   for(i=0;i<month;i++)
   {dayth=dayth+th[i];}
   dayth=dayth+day;

}

}

   int date::getdate(){
   return dayth;
}

int main(){

int day;
int month;
int year;
cout<<"输入日期:";
cin>>day;
cout<<"输入月份:";
cin>>month;
cout<<"输入年份:";
cin>>year;
date q1(day);
date q2(day,month);
date q3(day,month,year);
cout<<"此日是一年的第"<<q1.getdate()<<"天\n";
cout<<"此日是一年的第"<<q2.getdate()<<"天\n";
cout<<"此日是一年的第"<<q3.getdate()<<"天\n";
return 1;
}

posted on 2005-12-12 21:23 10003 阅读(1566) 评论(8)  编辑 收藏 引用

评论

# re: int 到底在干什么? 2005-12-13 01:31 蔡蔡
你不是在class date声明中声明了一个成员变量是dayth了嘛,在date的范畴中,dayth被认为已经定义了,不能再在date类中定义其他叫做dayth的变量了。  回复  更多评论
  

# re: int 到底在干什么? 2005-12-13 10:01 e夜星空
'int'在干你让他干的事!
就像以下语句中的类型'float'一样,是声明其后变量的类型:
float fool_donkey;
自然以下语句是在声明clever_donkey为int类型变量同时初始化其值为748:
int clever_donkey = 748;

如果你把函数中的两个dayth前的类型'int'改为'float',就好解释一些了:
在类date里声明了一个整型的变量名为dayth,而在date的成员函数date::date()里又声明了一个float型变量,它的名字也叫dayth。
注意上面的*‘也’*字,它表明函数里的dayth并不是类成员的dayth,
它们只是同名的不同变量,
所以函数对dayth赋值都是对它自己声明的临时变量操作(与那个同名的类成员无关)。

可以把class date的声明改成以下形式,整个程序效果是一样的。
class date{
//int dayth;
int not_used_dayth;

public:
date(int day);
date(int day,int month);
date(int day,int month,int year);
int getdate();
};

这个问题就是C++中的命名空间相关的,
一个class是一个空间,就如中国
类的成员函数是其下的子空间,你可以当作是北京市。
中国国家主席是锦涛,
北京市某家庭刚出生的一个小孩也被你父亲起名为锦涛。
这样在他们家里每次叫锦涛的时候,
你觉得他们在叫谁?

那么回到你的程序中,
明明类已经有一个锦涛(dayth),
你就是给你的孩子起名叫锦涛(dayth),甚至连姓都和人家一样(int),
你还说不清楚你在干什么?还问人家我那个'int'起什么作用?

笑话!
你把红色的'int'去掉又是什么意思呢?
没有int的语句如下:
clever_donkey = you;
是一个赋值语句,就像你在家说“锦涛吃饭了”,
毫没有给你们家的小孩起名为锦涛的意思,
以后每行语句中出现的“锦涛”都是我们的国家主席该做什么什么。

  回复  更多评论
  

# re: int 到底在干什么? 2005-12-13 15:40 初始化
不知道楼上两位是不是真的懂点语言,或者OO,
这是一个很基础的关于全局变量和局部变量的问题,当在函数内部定义了与全局变量同名的变量时,本函数内处理局部变量,但是在你调用getdate()时,是返回的这个类的全局变量,而不是类中某个函数的局部变量。函数中的局部变量在离开这个类后就释放了。
拜托各位先好好学习基础知识,这种问题都没有人愿意来理了。

date::date(int day,int month){
int i;
int th[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayth=0;
for(i=0;i<month;i++)
{dayth=dayth+th[i];}
dayth=dayth+day;
}
举这个例子,
你在函数内部定义了一个新的变量:
int dayth=0; 赋值为0,所以在这个函数中类的属性(或者变量)就不再包含。当该函数结束时,这个函数内部的变量就被释放了,而在调用这个函数date(int day,int month)的过程中,都没有改变你的类属性dayth,而调用类函数getdate()时,使返回的类的属性dayth。
拜托,真的应该先看完书再做这些,居然还问int做了什么。
还有楼上两位,如果是命名冲突,在编译时就会报错了。  回复  更多评论
  

# re: int 到底在干什么? 2005-12-15 09:16 e夜星空
不知道上一楼在卖弄什么?
1. 是说它很懂语言,很懂面向对象OO?可是在它的字里行间并没有什么面向对象的东西。
2. 是说它本人不是人吗(见第4行“这种问题都没有人愿意来理了”),那能否以真面目示人,你是猪呢还是狗?
3. 另外它在卖弄一些概念也是乱七八糟的,大部分与原问题毫不相干.原问题只是构造函数自动变量覆盖同名的成员变量。你扯什么全局变量与局部变量?另外你愿意解答问题固然是好,虽然你自认为不是人,大家也不会怪你,答得不好也没什么。但你不应该通过攻击人来显示你的智商能与人相当。
4. 你还卖弄在函数内定义了与成员变量同名的变量,在这个函数就不能再包含类的那个成员变量了?自己回去看看书吧。
5. 什么?看不懂,那以后你少在公众场合放屁。  回复  更多评论
  

# re: int 到底在干什么? 2005-12-15 09:30 e夜星空
重新回到原来的问题,解答一下:
1. 本程序不是整数溢出的事。getdate输出的值是一个未经初始化的整数值。与以下代码类似:
int a;
std::cout << a << std::endl;
2. 本这段代码先后定义了3个名为dayth的变量,互不相干。同名却不冲突,因为他们在不同的作用域范围。
3. 重载的两个构造函数中所操作的是它们通过int定义的自动本地变量dayth,而始终未修改类成员变量dayth。
构造函数使用如下的初始化列表后,q2.getdate()和q3.getdate()返回的都是初始化的值(下例为0).
date::date(int day,int month) : dayth(0){
...
}

date::date(int day,int month,int year) : dayth(0){
...
}  回复  更多评论
  

# re: int 到底在干什么? 2005-12-16 11:51 fancy
是可以运行的啊,函数里面的那个变量在函数退出去的时候就被销毁了,要想保存到class类里的dayth可以这样调用this->dayth=dayth+day  回复  更多评论
  

# re: int 到底在干什么? 2006-03-30 22:29 笑笑生
谦虚点  回复  更多评论
  

# re: int 到底在干什么? 2006-04-03 00:43
大家冷静点,保持学习的乐土:)  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理