鱼C论坛

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

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

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

  2. using namespace std;

  3. class A
  4. {
  5. public:
  6.         A(int l){lenght = l; size = new char[lenght];}
  7.         ~A(){delete []size;}
  8.         int GetLength(){return lenght;}
  9.   char&operator[](int i)
  10.   {
  11.         
  12.          if(i>=0 && i<lenght)
  13.          {
  14.                  return size[i];
  15.          }
  16.          else
  17.          {
  18.            cout<<"\n超出范围.";
  19.            return size[lenght-1];
  20.          }
  21.   }
  22. private:
  23.         int lenght;
  24.         char *size;

  25. };

  26. int main()
  27. {
  28.   A a(6);
  29.   char *ch="hello12";
  30.   for(int i=0;i<8;i++)
  31.   {
  32. 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;
}

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

  2. using namespace std;

  3. class A
  4. {
  5. public:
  6.         A(int l){lenght = l; size = new char[lenght];}
  7.         ~A(){delete []size;}
  8.         int GetLength(){return lenght;}
  9.         char&operator[](int i)
  10.         {

  11.                 if(i>=0 && i<lenght)
  12.                 {
  13.                         return size[i];
  14.                 }
  15.                 else
  16.                 {
  17.                         cout<<"\n超出范围.";
  18.                         return size[lenght-1];
  19.                 }
  20.         }
  21. private:
  22.         int lenght;
  23.         char *size;

  24. };

  25. int main()
  26. {
  27.         A a(8);
  28.         char *ch="hello12";
  29.         for(int i=0;i<8;i++)
  30.         {
  31.                 a[i]=ch[i];//a不是类对象吗;为什么这样可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函的;
  32.         }
  33.         cout<<"\n\n";
  34.         for(int i=0;i<8;i++)
  35.         {
  36.                 //cout << i << endl;
  37.                 cout << a[i];
  38.                 //cout >> a;  //cout<<a;//这条代码又是怎么调用 运算符重载函数的 ;
  39.         }
  40.         flushall();
  41.         getchar();
  42.         return 0;
  43. }
复制代码
运行结果:
2.jpg

小甲鱼最新课程 -> https://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]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-19 18:18:20 | 显示全部楼层
看是都是高手啊
小甲鱼最新课程 -> https://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对象将无法使用[]运算符读取数据,这是很可笑的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-9-1 09:36:16 | 显示全部楼层
帮顶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 02:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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