免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1960 | 回复: 5
打印 上一主题 下一主题

[C++] 关于运算符重载的一些问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-13 23:29 |只看该作者 |倒序浏览
10可用积分
问题1:
#include<iostream>
using namespace std;
class Point
{
      private:
              int x,y;
      public:
             Point(int X,int Y){x=X;y=Y;}
             int display(){cout<<"("<<x<<","<<y<<"";}
             Point operator ++();             //对类Point重载++运算符        
};
Point Point:perator++()
{  return Point(++x,++y);}

int main()
{
  Point a(1,2);
  cout<<"++a(1,2)="<<(++a).display();//运行结果是(2,3)++a(1,2)=4473856,为什么是出现这样的错误?
  system("pause";
  return 0;
}
问题2:
#include<iostream>
using namespace std;
class Shape
{
      public:
      virtual double getarea()=0;//纯虚函数
      virtual double getperim()=0;
      };
class rectangle:public Shape//应该不难理解,派生两个类
{
public:
rectangle (double x,double y){a=x; b=y;}
double  getarea(){cout<<a*b;}
double   getperim(){cout<<2*(a+b);}
private:
double a,b;
};
class circle:public Shape
{
public:
circle (double t){a=t;}
double getarea(){return 3.14*a*a;}
double getperim(){return 2*3.14*a;}
private:
double a;
};
void fun(Shape *a)
{
a->getarea();
a->getperim();
}
int main()
{
Shape *b;
rectangle c(3,4);//结果1214,如何把面积12和长度14的数据隔开?
circle d(4);//为什么圆类的长度面积没有显示呢?
b=&c;
fun(b);
b=&d;
fun(b);
}

问题3
#include<iostream>//输入字符串,计算其长度
using namespace std;
int slen(char *s)
{
for(i=0;s++;i++)
    return i;
}
int main()
{
    //在前面那个函数下,如何输入一个字符串呢?
   
  
   
    cout<<"长度是"<<slen(s)<<endl;
   
    return 0;
}

问题四
int a=5,*pa=&a,&(*pa)的值是多少?为什么?(我在机上试了,只是个内存地址...)

将单目运算符++重载为成员函数形式
#include<iostream>//这个程序的运行结果跟课本不同,课本的数据分别是23:59:59,23:59:59,0:0:1
using namespace std;
class Clock
{
      public:
             Clock(int NewH=0,int NewM=0,int NewS=0);
             void ShowTime();
             Clock&operator ++();//这里的&是什么意思,老师说去掉它也可以,为什么呢?

             Clock operator ++(int );
             private:
                     int Hour,Minute,Second;
};
Clock::Clock(int NewH,int NewM,int NewS)
{
if(0<NewS&&NewH<24&&0<=NewM&&NewM<60&&0<=NewS&&NewS<60)
{
Hour=NewH;
Minute=NewM;
Second+NewS;
}
else
cout<<"Time error!"<<endl;
}

void Clock::ShowTime()
{
           cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
Clock&Clock:perator ++()
{
Second++;
if(Second>=60)
           {
                                 Second=Second-60;
                                 Minute++;
                                 if(Minute>=60)
                                 Hour++;
                                 if(Minute>=60)
                                 {
                                               Second=Second-60;
                                               Hour++;
                                               Hour+Hour%24;
                                 }
           }
           return *this;
           }
Clock Clock:perator++(int )
{
            Clock old=*this;
            ++(*this);
            return old;
}
int main()
            {
                Clock myClock(23,59,59);
                cout<<"First time output:";
                myClock.ShowTime();
                cout<<"Show myClock++:";
                (myClock++).ShowTime();
                cout<<"show ++myClock:";
                (++myClock).ShowTime();//我的运行结果是23:23:-1346719276,23:23:-1346719276,23:23:-1346719274,让我很奇怪,因为我是完全按书本敲进去的
                return 0;
            }
很希望从这次提问中学到些什么,谢谢。

最佳答案

查看完整内容

rectangle c(3,4);//结果1214,如何把面积12和长度14的数据隔开?circle d(4);//为什么圆类的长度面积没有显示呢?circle的double getarea(){return 3.14*a*a;}double getperim(){return 2*3.14*a;}并没有调用cout,当然没有显示

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2009-06-13 23:29 |只看该作者
原帖由 中国可爱小牛 于 2009-6-13 23:29 发表
#include<iostream>
using namespace std;
class Shape
{
      public:
      virtual double getarea()=0;//纯虚函数
      virtual double getperim()=0;
      };
class rectangle:public Shape//应该不难理解,派生两个类
{
public:
rectangle (double x,double y){a=x; b=y;}
double  getarea(){cout<<a*b;}
double   getperim(){cout<<2*(a+b);}
private:
double a,b;
};
class circle:public Shape
{
public:
circle (double t){a=t;}
double getarea(){return 3.14*a*a;}
double getperim(){return 2*3.14*a;}
private:
double a;
};
void fun(Shape *a)
{
a->getarea();
a->getperim();
}
int main()
{
Shape *b;
rectangle c(3,4);//结果1214,如何把面积12和长度14的数据隔开?
circle d(4);//为什么圆类的长度面积没有显示呢?
b=&c;
fun(b);
b=&d;
fun(b);
}


rectangle c(3,4);//结果1214,如何把面积12和长度14的数据隔开?
double  getarea() {cout << a*b << endl ;}
double   getperim() { cout << 2*(a+b) << endl;}


circle d(4);//为什么圆类的长度面积没有显示呢?
circle的
double getarea(){return 3.14*a*a;}
double getperim(){return 2*3.14*a;}
并没有调用cout,当然没有显示

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2009-06-14 07:18 |只看该作者
原帖由 中国可爱小牛 于 2009-6-13 23:29 发表
问题1:
#include<iostream>
using namespace std;
class Point
{
      private:
              int x,y;
      public:
             Point(int X,int Y){x=X;y=Y;}
             int display(){cout<<"("<<x<<","<<y<<")";}
             Point operator ++();             //对类Point重载++运算符        
};
Point Point:perator++()
{  return Point(++x,++y);}

int main()
{
  Point a(1,2);
  cout<<"++a(1,2)="<<(++a).display();//运行结果是(2,3)++a(1,2)=4473856,为什么是出现这样的错误?
  system("pause");
  return 0;
}



对于这一行代码
cout<<"++a(1,2)="<<(++a).display();


表达式(++a).display()首先计算++a,然后调用a.display,但是传递给cout <<的是变化后的对象a
调用display显示(2,3);再cout << a显示4473856
这里LZ没有重载 << 运算符

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
4 [报告]
发表于 2009-06-14 07:25 |只看该作者
原帖由 中国可爱小牛 于 2009-6-13 23:29 发表
问题3
#include<iostream>//输入字符串,计算其长度
using namespace std;
int slen(char *s)
{
for(i=0;s++;i++)
    return i;
}
int main()
{
    //在前面那个函数下,如何输入一个字符串呢?
   
  
   
    cout<<"长度是"<<slen(s)<<endl;
   
    return 0;
}


char buf[SOME_SIZE];
cin >> buf;
感觉string要好一些
string buf;
cin >> buf;
可以看一下C++ Primer,里面有一章专门讲IO

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2009-06-14 07:30 |只看该作者
原帖由 中国可爱小牛 于 2009-6-13 23:29 发表
int a=5,*pa=&a,&(*pa)的值是多少?为什么?(我在机上试了,只是个内存地址...)


a是简单int型变量,pa也是变量,只不过它存放的是a的地址
*pa是解引用指针,得到的是变量a,&(*pa)相当于&a

cout << pa << ' ' << &a << ' ' << &(*pa) << endl;
可以看到,它们的值是一样的

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
6 [报告]
发表于 2009-06-14 07:40 |只看该作者
[quote]原帖由 中国可爱小牛 于 2009-6-13 23:29 发表
将单目运算符++重载为成员函数形式
#include<iostream>//这个程序的运行结果跟课本不同,课本的数据分别是23:59:59,23:59:59,0:0:1
using namespace std;
class Clock
{
      public:
             Clock(int NewH=0,int NewM=0,int NewS=0);
             void ShowTime();
             Clock&operator ++();//这里的&是什么意思,老师说去掉它也可以,为什么呢?

             Clock operator ++(int );
             private:
                     int Hour,Minute,Second;
};
Clock::Clock(int NewH,int NewM,int NewS)
{
if(0<NewS&&NewH<24&&0<=NewM&&NewM<60&&0<=NewS&&NewS<60)
{
Hour=NewH;
Minute=NewM;
  1. [/code]
  2. Second+NewS;
  3. }
  4. else
  5. cout<<"Time error!"<<endl;
  6. }

  7. void Clock::ShowTime()
  8. {
  9.            cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
  10. }
  11. Clock&Clock::operator ++()
  12. {
  13. Second++;
  14. if(Second>=60)
  15.            {
  16.                                  Second=Second-60;
  17.                                  Minute++;
  18.                                  if(Minute>=60)
  19.                                  Hour++;
  20.                                  if(Minute>=60)
  21.                                  {
  22.                                                Second=Second-60;
  23.                                                Hour++;
  24.                                                Hour+Hour%24;
  25.                                  }
  26.            }
  27.            return *this;
  28.            }
  29. Clock Clock:perator++(int )
  30. {
  31.             Clock old=*this;
  32.             ++(*this);
  33.             return old;
  34. }
  35. int main()
  36.             {
  37.                 Clock myClock(23,59,59);
  38.                 cout<<"First time output:";
  39.                 myClock.ShowTime();
  40.                 cout<<"Show myClock++:";
  41.                 (myClock++).ShowTime();
  42.                 cout<<"show ++myClock:";
  43.                 (++myClock).ShowTime();//我的运行结果是23:23:-1346719276,23:23:-1346719276,23:23:-1346719274,让我很奇怪,因为我是完全按书本敲进去的
  44.                 return 0;
  45.             }
  46. [/quote]

  47. [code]Clock &operator++(); //这里的&是什么意思,老师说去掉它也可以,为什么呢?
复制代码

这里表示返回一个Clock引用,如果不使用&,那么在函数里面改变this对象后,再返回时需要调用对象的复制构造函数以创建新的对象,若是使用&则就可以继续使用this对象了

  1. Clock::Clock(int NewH,int NewM,int NewS)
  2. {
  3.         if ( 0 < NewS && NewH < 24 && 0<=NewM && NewM < 60 && 0 <= NewS && NewS < 60 ){
  4.                 Hour = NewH;
  5.                 Minute = NewM;
  6.                 Second + NewS;
  7.         } else
  8.                 cout<<"Time error!"<<endl;
  9. }
复制代码

Second + NewS;是干什么


  1.                                  if(Minute>=60)
  2.                                  {
  3.                                                Second=Second-60;
  4.                                                Hour++;
  5.                                                Hour+Hour%24;
  6.                                  }
复制代码

Hour+Hour%24; 好像也没做什么

没有仔细看
LZ认真检查一下代码
应该都是抄代码时写错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP