社区
C语言
帖子详情
一个c++问题
hyqryq
2001-01-12 06:33:00
在流库ios中,有一个函数int operator()是什么意思?
好像并不是算符从载呀?
...全文
269
6
打赏
收藏
一个c++问题
在流库ios中,有一个函数int operator()是什么意思? 好像并不是算符从载呀?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bugn
2001-01-14
打赏
举报
回复
to myan:
请注意int operator()跟operator int()是不一样的!hyqryq说的情况是int operator().
这个问题在若干年前用Dos下的Borland编译器时我就注意到了,当时查找所有的资料都没有说。我当时的理解是这是一个空运算符(uniary的),返回值为int类型;这里与类型转化不同的是你不能这样定义: 如果你定义了int operator(),就不能定义void* operator();
但是可以定义:operator int(),operator void*()同时存在。
但现在新的编译器已经不支持这一点了,我现在用的VC如果写上int operator()的话就会报错,gcc也一样。现在的ios库也改掉了成了operator void *() const,上面的while(file)中调用的是operator void*()const;
to hyqryq:
这一行int operator!()是重载!运算符。
如果你发现代码里有把类和其他类型的数据比较的话,一般是调用了类型转化运算符的。例如:
struct SFoo
{
operator int();
operator void*();
}
SFoo foo;
if (foo != 0 ) //调用 operator int()
if (foo != NULL)//还是调用 operator int()
if (foo != (void*)NULL)//调用 operator void*()
if (foo) // 调用operator int()
要注意的是:
struct SFoo {
operator int*();
operator void*();
}
SFoo foo;
if (foo) // 错误,编译器不知道该调用 operator int*()还是operator void*()
这里有意思的是好像int比pointer优先,所以前面一例中的int和void*同时存在时写if (foo)倒是正确的
注意下例:
SFoo{operator void*();}
SFoo foo;
if (foo) //调用 void*
另外如果重载()的要写成这样:
int operator()() //即使没参数
myan
2001-01-14
打赏
举报
回复
to hyqryq:
1998年标准C++对于IOS库做了很大调整, 全部采用模板类, 以前的ios库正在
被淘汰, 一些旧的不合规范的语法和标记已经被废弃. 你应该学习新的ios类库.
myan
2001-01-13
打赏
举报
回复
关于这个问题的全面解释:
1. C++中关键字operator除了提供运算符重载之外,还提供类型转换能力。
例如:
class A::operator int() {
...
}
可以将*this对象转化为int类型。这是C++中一个非常重要的特性,也比较
复杂,以下是一些规则,篇幅所限不便展开,建议你找有关书籍全面了解。
简单规则如下:
1)所有类型转换函数均无返回类型声明,但返回一个值,其类型应与声明吻合。
2)在运行中要求进行隐式类型转换时,对象按上下文需求调用相应的类型转换函数,
自动转化为该类型。
3)如果在客户代码中使用了强制类型转换,则类必须提供相应的类型转换函数。
简单地说,如果程序中有 (long)obj 语句,你必须显式提供 operator long(),
只提供 operator int(), 然后指望obj先转换为int,再自动转换为 long,那
是行不通的。
4)如果类定义了一系列类型转换函数,而在客户代码中有含义不清的上下文,也就是
说多个类型转换函数都可以满足需求,则编译器会因为不知道该调用那个类型转换
函数而报错。
2. 具体在你的程序中,首先 ifstream file( "input.txt" ) 调用了
ifstream::ifstream( const char* szName,
int nMode = ios::in,
int nProt = filebuf::openprot );
这个构造函数。这个构造函数里使用的缺省参数nMode = ios::in 是不合理的,因为
如果指定路径中没有文件可供打开则自动生成一个0长度文件,这恐怕不是你想要的
情况,应该显式调用 ifstream file( "input", ios::in | ios::nocreate ).
在if ( !file ) 这一句, int ios::operator!() 函数。
如果函数打开不成功,streambuf流的状态必然是bad或者fail,于是这个函数返回true.
在 while ( file ) 一句中,语句本身需要一个bool或者int值,但是在
basic_ifsteam --> basic_istream --> basic_ios --> ios_base
整个这一条继承链中,都没有 operator int() 或者 operator long(),
operator float() 之类的类型转换函数,所以只好调用
basic_ios<E,T>::operator void *()来凑数。这个函数返回的也是
表明streambuf流状态的值,如果文件到了EOF,则streambuf的状态必然是fail, 于是
返回false. 结果,while ( file ) 这个语句就成了判断文件是否到尾的语句。
附带说明一句,这是很不好的编程风格。应该写成 while ( !file.eof() ). 另外,
程序结尾时应该调用file.close()关闭文件. 建议使用新的iostream类库。
推荐形式:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char buffer[80];
ifstream file( "input.txt", ios_base::in );
int linecount = 0;
if( !file ) {
cout<<"Cann't open input file"<<endl;
return 1;
}
file.seekg(0);
while( file.eof() == false ) {
file.getline( buffer, sizeof(buffer)+1, '\n' );
linecount++;
}
file.close();
cout<<"the file include "<<--linecount<<" lines\n";
return 0;
}
hyqryq
2001-01-13
打赏
举报
回复
感谢两问老兄.
这是类库ios中的函数定义,其中有一些我看不懂.
................
int operator()
int operator!()
..................
有一个程序,在VC6下测试无误.
#include <fstream.h>
main()
{
char buffer[80],word[80];
ifstream file("input.txt");
int linecount=0;
if(!file) //看不懂,有这样的调用方法吗?
{
cout<<"cann't open input file"<<endl;
return;
}
file.seekg(0);
while(file)//更不懂了,若要调用重载()运算符,应为while((file))呀!
{
file.getline(buffer,sizeof(buffer));
linecount++;
}
linecount--;
cout<<"the file include"<<linecount<<"lines\n";
}
但这个程序运行是无误的,望各位高手指点! (^-^)
myan
2001-01-12
打赏
举报
回复
如果是operator int(), 是类型转化成员函数, 将*this对象转换为int类型.
你给出的代码太短, 能不能把附近的几行copy下来?
sun2000
2001-01-12
打赏
举报
回复
类型转换, int可以转换成integer型
每个开发人员现在应该下载的十种必备工具,这个是中文的哦
每个开发人员现在应该下载的十种必备工具
每个开发人员现在应该下载的十种必备工具
每个开发人员现在应该下载的十种必备工具
•
用于编写单元测试的 NUnit•
用于创建代码文档资料的 NDoc•
用于生成解决方案的 NAnt•
用于生成代码的 CodeSmith•
用于监视代码的 FxCop•
用于编译少量代码的 Snippet Compiler•
两种不同的转换器工具:ASP.NET 版本转换器和 Visual Studio .NET 项目转换器•
用于生成正则表达式的
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章