鱼C论坛

 找回密码
 立即注册
查看: 4292|回复: 11

问一个关于流对象(cout)的很菜的问题

[复制链接]
发表于 2012-10-10 19:54:40 | 显示全部楼层 |阅读模式
5鱼币
不论是看书的时候,还是在网上找相关资料的时候,看上面都说:

cout 是 ostream_withassign 类的对象;
cin 是 istream_withassign 类的对象;

可是在定义类的时候定义:

ostream cout(stdout);

而不是:

ostream_withassign cout(stdout);

并且在声明友运算符重载函数的时候,也是这样声明cout的引用类型的:

ostream & operator << (ostream &,用户自定义类型名 &);

既然在定义和使用cout对象时都是用的ostream这个类,为什么书上和网上资料里又都说:ostream_withassign类是ostream类的派生类,而cout是ostream_withassign类的对象?

如果是这样,为什么不直接用ostream_withassign来定义对象或引用对象呢?

最佳答案

查看完整内容

这句是扯蛋,你可以打开iostream查cout,查到如下信息 extern _CRTIMP ostream cout; 说明cout是在另外的地方定义,实际上,cout对象是在C++标准库中定义的。 ostream & operator
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-10 19:54:41 | 显示全部楼层
可是在定义类的时候定义:
ostream cout(stdout);

这句是扯蛋,你可以打开iostream查cout,查到如下信息
extern _CRTIMP ostream cout;
说明cout是在另外的地方定义,实际上,cout对象是在C++标准库中定义的。

ostream & operator << (ostream &,用户自定义类型名 &);
已知ostream_withassign 是ostream的派生类,那么函数定义的时候用基类指针或引用指向派生类 的对象,这个是“面向对象”的基础。事实上,这里的ostream&处可传递任意的ostream类型或其子类的对象。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-10 20:06:29 | 显示全部楼层
楼下谁能给楼主找一个恰当的例子,让楼主不再纠结于这种名词文字游戏?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-10 21:51:14 | 显示全部楼层

ostream & operator << (ostream &,用户自定义类型名 &);  这个我懂了

ostream cout(stdout); 这句我是在谭浩强的c++书中看到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-10 21:56:58 | 显示全部楼层
不要随便相信书上写的,尤其是中国人写的书。你随便写个程序,用鼠标选中
#include <iostream>右键选择打开文件
再查找cout就看到了,不可能定义为ostream cout(stdout);的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-10 21:59:23 | 显示全部楼层
#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
        ostream kk(stdout);
}
很容易证明这个写法是错的,比如你写如下程序,编译下就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-10 22:10:31 | 显示全部楼层
仰望天上的光 发表于 2012-10-10 21:59
很容易证明这个写法是错的,比如你写如下程序,编译下就知道了。

#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
        ostream_withassign kk(stdout);
        return 0;
}
可是这样也是错的呀,那不是说明参数 stdout 也是错的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-10 22:21:01 | 显示全部楼层
友来友网 发表于 2012-10-10 22:10
#include
#include
using namespace std;

这个程序是错的只是为了说明书上在乱说。如果他真的能定义一个名字叫做cout的对象,那我们为什么不能定义一个名字叫做kk的对象?
谭浩强的书好处仅仅是通俗易懂,带人入门,但是书中到处都是错误,有一定实力后必定受这些错误思想的影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-11 07:31:27 | 显示全部楼层
仰望天上的光 发表于 2012-10-10 22:21
这个程序是错的只是为了说明书上在乱说。如果他真的能定义一个名字叫做cout的对象,那我们为什么不能定义 ...

今天早上我又试了一下,发现  ostream & operator << (ostream &,用户自定义类型名 &)   在重载的时候将
ostream  换成  ostream_withassign  编译就出错, 这是不是就说明 cout 根本就不是ostream_withassign 的对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-11 13:20:44 | 显示全部楼层
友来友网 发表于 2012-10-11 07:31
今天早上我又试了一下,发现  ostream & operator

不能这么说。这个编译错误仅仅说明你因为没有ostream_withassign 的头文件而不能访问该类。ostream_withassign 类型对用户不可见,你仅仅知道它是ostream的子类。事实上你根本没有必要深究cout的实际类型是什么,只要知道:ostream类型是它的父类型就可以了。

这样做是有好处的,(就是 不让 你 创建某些 类型 的对象,但同时又允许你使用已经创建的该类型对象)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-11 13:41:42 | 显示全部楼层
查找cout就看到了,不可能定义为ostream cout(stdout)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-11 19:03:20 | 显示全部楼层
空瓶氧气 发表于 2012-10-11 13:41
查找cout就看到了,不可能定义为ostream cout(stdout)

查不到定义的,定义位于C++标准库的二进制文件里。只能在头文件里查到声明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-18 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表