.任.ポ 发表于 2013-3-18 02:50:17

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

本帖最后由 .任.ポ 于 2013-3-18 02:57 编辑

#include<iostream>

using namespace std;

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

};

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

cout<<a;//这条代码又是怎么调用 运算符重载函数的 ;
还有一段代码放不上去不知道为什么,在下面(接上面代码)

}
cout<<"\n\n";
for(i=0;i<8;i++)
{
          cout<<a;cout<<a;//这条代码又是怎么调用 运算符重载函数的 ;
}
return 0;
}

小新110 发表于 2013-3-18 13:16:01

首先,程序有两处错误:
1、声明a的时候给的空间太小,hello12总共需要8个字节,只声明6个的话后面的12是没有地方存储的。
写或者读,都会报预先存储的提示:超出范围。
运行结果:

2、输出的时候需要输出a,直接对象是不可以的,编译不过去。
修改代码:
#include<iostream>

using namespace std;

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

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

};

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


小新110 发表于 2013-3-18 13:17:54

a=ch;//a不是类对象吗;为什么可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函数的;

a是对象,这样赋值是不可以的。
所以要用a=ch来赋值。
这时候会调用重载函数,i在范围内的话,返回的是size,相当于给size赋值。
后面的打印原理同前。

时英祥 发表于 2013-3-19 18:18:20

看是都是高手啊

仰望天上的光 发表于 2013-3-19 20:42:23

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

还有个不那么严重的问题,运算符[]的重载必须要有两版本一个是:
char& operator[](int i);用于非const对象;另一个
char operator[](int i)const;用于const对象;如果不这样处理,那么这个类型的const对象将无法使用[]运算符读取数据,这是很可笑的。

阔怀 发表于 2015-9-1 09:36:16

帮顶
页: [1]
查看完整版本: C++小问题求助!不胜感激~