首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

看过<<C++编程风格>>的进来一下,发现一个有关问题

2012-02-23 
看过C++编程风格的进来一下,发现一个问题最近我在看一本书,就是TomCargill著,聂雪军译的一本 C++编

看过<<C++编程风格>>的进来一下,发现一个问题
最近我在看一本书,就是Tom   Cargill   著,聂雪军   译的一本 < <C++编程风格> > ( < <C++Programming   Style> > ,机械工业出版社),看到第五章发现一个问题:  
书上给出了一个将文件抽象成字节数组的一个重载运算符的例子,改进后的程序如下:  
#include   <fstream.h>  
#include   <iostream.h>  
//-----------------------------------------------------  
class   Index{  
friend   class   FileArray;  
public:  
Index&   operator=(char   c);  
operator   char();  
private:  
FileArray   *fa;  
streampos   fileptr;  
Index(FileArray*   _fa,int   x);  
};  
//-----------------------------------------------------  
class   FileArray{  
friend   class   Index;  
public:  
FileArray(char*   fName):fs(fName,ios::in   |   ios::out){}  
Index   operator[]   (unsigned   x){return   Index(this,x);}  
private:  
FileArray&   operator=   (const   FileArray&);  
fstream   fs;  
};  
//-----------------------------------------------------  
Index::Index(FileArray*   _fa,int   x){  
fa=_fa;  
fileptr=streampos(x);  
}  
Index&   Index::operator=(char   c){  
fa-> fs.seekp(fileptr,ios::beg);  
fa-> fs.write(&c,1);  
fa-> fs.flush();  
return   *this;  
}  
Index::operator   char(){  
char   buf;  
fa-> fs.seekg(fileptr,ios::beg);  
fa-> fs.read(&buf,1);  
return   buf;  
}  
//-----------------------------------------------------  
void   main()  
{  
FileArray   f( "e1_1.cpp ");  
f[0]=f[1];  
}  
根据书上的说法f[0]=f[1];一句是可以实现同一文件不同索引字符的赋值的,但是我用BC++5.5和VC6都不能得到结果.  
书上说这句相当于  
(f.operator[](0)).operator=(   (f.operator[](1)).operator   char()   )  
编译时相当于生成两个Index中间变量,然后复制相应的索引对应的值.  
但是根据观察和调试,这一过程并不存在,而是系统根据默认的拷贝构造函数和默认重载的赋值运算符完成了一个浅拷贝  

我是希望看过这本书的人或者对这个问题有研究的人发表一下看法研究一下,看看是我的理解有问题还是书上的说法有问题

[解决办法]
我试了一下,好像f[0]=f[1];解释成了(f.operator[](0)).operator=( (f.operator[](1)
并没有调用operator char()
[解决办法]
同意lz看法,应该是例子有问题吧。自己定义一个拷贝赋值函数,明确调用一下operator char() 就可以解决了。

热点排行