社区
C语言
帖子详情
一个c++问题
hyqryq
2001-01-12 06:33:00
在流库ios中,有一个函数int operator()是什么意思?
好像并不是算符从载呀?
...全文
162
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型
C&
C++
语言学习大全套【精品】
2012-C&
C++
语言大全.zip C&
C++
语言教程大礼包.rar C_
C++
+指针的13份资料.zip C_
C++
程序员实用大全.zip
C++
程序设计语言特别版(中文版) .rar C语言大全第4版+源码.rar C语言阶梯式教程【从白痴到资深专家】 .pdf 你必须知道的495个C语言
问题
(完整版).rar
从
C++
类创建后,自动创建的函数有哪些开始谈起
最近遇到
一个
C++
问题
,
C++
类创建后,会自动创建哪些函数??这个
问题
如果如果不够仔细或者平时不太注意的话,就会答得不够完全,所以以下我将一一介绍,并进行一些展开。 首先,这个
问题
的答案是:默认构造函数,析构函数,拷贝构造函数以及默认赋值函数。 下面我将对拷贝构造函数以及默认赋值函数进行简单的介绍。 第一,拷贝构造函数。 (1)顾名思义,简单的来说拷贝构造函数就是对类的
C++
一个
项目只允许有
一个
main函数怎么办
C++
中
一个
项目只允许有
一个
main()函数怎么办大家在学习
C++
的时候
一个
项目只允许有
一个
main函数怎么办(本人IDE为Visual Studio)这两天学习
c++
发现了
一个
问题
,当你跟着教程去编写时候,会有
一个
项目下只能有
一个
main函数的情况,而已经编好的代码对于初学者来说也不能直接删除不是,所以在这个时候可以将main函数后面添加上一些数字,比如main01,main02。。。这样main函数就会变成普通的函数,这里需要注意的一点是,普通函数如果没有注明无返回值的情况下,是要有return语句的,
C/
C++
经典算法——约瑟夫
问题
C/
C++
经典算法——约瑟夫
问题
什么是约瑟夫
问题
一行代码解决约瑟夫
问题
!!!
C++
:第
一个
程序
C++
的第
一个
程序为
一个
向控制台输出向世界问好的程序,源码如下,其程序文件名可为HelloWorld.cpp: #include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; using namespace std; int main(int argc, cha
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章