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;
}
首先,程序有两处错误:
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;
}运行结果:
a=ch;//a不是类对象吗;为什么可以这样赋值请详细说明,还有这条代码怎么调用运算符重载函数的;
a是对象,这样赋值是不可以的。
所以要用a=ch来赋值。
这时候会调用重载函数,i在范围内的话,返回的是size,相当于给size赋值。
后面的打印原理同前。
看是都是高手啊 其实,这类经典问题还有两个地方的严重bug你们没注意到:
1.没有重载拷贝构造函数
2.没有重载赋值运算符
这样C++将采用默认的浅拷贝来实现这两个操作,结果是显然的,无数的C++考试都出国这类题目(想知道结果自己调用下它们就知道了)
还有个不那么严重的问题,运算符[]的重载必须要有两版本一个是:
char& operator[](int i);用于非const对象;另一个
char operator[](int i)const;用于const对象;如果不这样处理,那么这个类型的const对象将无法使用[]运算符读取数据,这是很可笑的。 帮顶
页:
[1]