社区
C语言
帖子详情
一个c++问题
hyqryq
2001-01-12 06:33:00
在流库ios中,有一个函数int operator()是什么意思?
好像并不是算符从载呀?
...全文
174
6
打赏
收藏
一个c++问题
在流库ios中,有一个函数int operator()是什么意思? 好像并不是算符从载呀?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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型
visual
c++
6.0英文版
Visual.
C++
6.0 英文版,绝对英文原版,非常好用,我一直是用它来做的练习!
Microsoft Visual
C++
2010 Redistributable Package
Microsoft Visual
C++
2010 Redistributable Package运行库,可以在不安装Microsoft Visual
C++
2010的情况下运行需要Microsoft Visual
C++
2010支持的软件、游戏补丁等程序。 本资源可以有效地解决因系统没有安装Microsoft Visual
C++
2010而不能运行某些软件的
问题
。已经在Windows 7上测试通过。
C++
“超级玛丽”游戏的源代码
C++
“超级玛丽”游戏的源代码,
C++
“超级玛丽”游戏的源代码.
C/
C++
指针经典资料大全
C/
C++
指针经典资料大全,十余部经典资料书籍,是您精通C指针的理想教程。
C++
经典程序
收集的一些经典的例程,关于
C++
的,希望大家有用
C语言
70,022
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章