鱼C论坛

 找回密码
 立即注册
查看: 2471|回复: 5

C++小问题求助!不胜感激~

[复制链接]
发表于 2013-3-18 02:50:17 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 .任.ポ 于 2013-3-18 02:57 编辑
#include<iostream>

using namespace std;

class A
{
public:
        A(int l){lenght = l; size = new char[lenght];}
        ~A(){delete []size;}
        int GetLength(){return lenght;}
  char&operator[](int i)
  {
        
         if(i>=0 && i<lenght)
         {
                 return size[i];
         }
         else
         {
           cout<<"\n超出范围.";
           return size[lenght-1];
         }
  }
private:
        int lenght;
        char *size;

};

int main()
{
  A a(6);
  char *ch="hello12";
  for(int i=0;i<8;i++)
  {
 a[i]=ch[i];//a不是类对象吗;为什么这样可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函的;
a[i]=ch;//[/i][i][i]a不是类对象吗;为什么可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函数的;

cout<<a;//这条代码又是怎么调用 运算符重载函数的[/i][/i]
[i][i]还有一段代码放不上去不知道为什么,在下面(接上面代码)
[/i][/i][i][i]
[/i][/i]  }
  cout<<"\n\n";
  for(i=0;i<8;i++)
  {
          cout<<a[i];[i][i]cout<<a;//这条代码又是怎么调用 运算符重载函数的[/i][/i]
  }
  return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-18 13:16:01 | 显示全部楼层
首先,程序有两处错误:
1、声明a的时候给的空间太小,hello12总共需要8个字节,只声明6个的话后面的12是没有地方存储的。
写或者读,都会报预先存储的提示:超出范围。
运行结果:
1.jpg
2、输出的时候需要输出a[i],直接对象是不可以的,编译不过去。
修改代码:
#include<iostream>

using namespace std;

class A
{
public:
        A(int l){lenght = l; size = new char[lenght];}
        ~A(){delete []size;}
        int GetLength(){return lenght;}
        char&operator[](int i)
        {

                if(i>=0 && i<lenght)
                {
                        return size[i];
                }
                else
                {
                        cout<<"\n超出范围.";
                        return size[lenght-1];
                }
        }
private:
        int lenght;
        char *size;

};

int main()
{
        A a(8);
        char *ch="hello12";
        for(int i=0;i<8;i++)
        {
                a[i]=ch[i];//a不是类对象吗;为什么这样可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函的;
        }
        cout<<"\n\n";
        for(int i=0;i<8;i++)
        {
                //cout << i << endl;
                cout << a[i];
                //cout >> a;  //cout<<a;//这条代码又是怎么调用 运算符重载函数的 ;
        }
        flushall();
        getchar();
        return 0;
}
运行结果:
2.jpg

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-18 13:17:54 | 显示全部楼层
a[i]=ch;//[/i][i]a不是类对象吗;为什么可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函数的; [/i]

[i]a是对象,这样赋值是不可以的。[/i]
[i][i]所以要用a[i]=ch来赋值。[/i]
[i][i]这时候会调用重载函数,i在范围内的话,返回的是size[i],相当于给size赋值。[/i]
[i]后面的打印原理同前。[/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-19 18:18:20 | 显示全部楼层
看是都是高手啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-19 20:42:23 | 显示全部楼层
其实,这类经典问题还有两个地方的严重bug你们没注意到:
1.没有重载拷贝构造函数
2.没有重载赋值运算符
这样C++将采用默认的浅拷贝来实现这两个操作,结果是显然的,无数的C++考试都出国这类题目(想知道结果自己调用下它们就知道了)

还有个不那么严重的问题,运算符[]的重载必须要有两版本一个是:
char& operator[](int i);用于非const对象;另一个
char operator[](int i)const;用于const对象;如果不这样处理,那么这个类型的const对象将无法使用[]运算符读取数据,这是很可笑的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-1 09:36:16 | 显示全部楼层
帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表