一个c++问题

hyqryq 2001-01-12 06:33:00
在流库ios中,有一个函数int operator()是什么意思?
好像并不是算符从载呀?
...全文
162 6 打赏 收藏 转发到动态 举报
写回复
用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型

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧