std命名空间与iostream文件对于cout的关系

风轻扬 2006-09-09 01:56:21
#include<iostream>
using namespace std;
void main()
{
cout << "hello world!";
}

上述语句中,cout我知道是Ostream类的实例,而这个类定义在iostream这个文件中,而cout又是std命名空间里的一个对象,这段代码的前两句,一个是文件,一个是命名空间,他们各自跟cout的关系是什么,对于cout来说他们之间的关系(文件和命名空间,对于cout来说)又是什么?
...全文
1707 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-09-10
  • 打赏
  • 举报
回复
或者说,
文件, 是 cout 客观上存在的位置;
名字空间,是 cout 逻辑上的位置。

首先要保证物理位置的正确,就是文件要包含,才有可能找到这个 cout;
其次,是要保证逻辑位置,也就是得到正确的名字空间找这个 cout ...

在两个都成立的前提下,
cout 才可以正常使用 ~
jixingzhong 2006-09-10
  • 打赏
  • 举报
回复
一个类,
总是定义在某一个文件中的,
这个容易理解;

在C++ 中,
为了防止名字冲突,
增加了 名字空间,
于是,
类类型在定义的时候,
是属于某一个名字空间的 .....

名字空间 和 文件没有直接联系 ...
多个类类型可以是定义在同一个文件中,同时可以是在不同的名字空间中;
或者,反过来也是可以成立 ...
sinkileu 2006-09-10
  • 打赏
  • 举报
回复
所有变量、函数、类…都可以让其作用域限定在一个命名空间中,以避免污染全局空间,而using指令让这个std命名空间相当于并入全局空间!

using namespace std; ===>
相当于:
//namespace std { //去掉这一行
   ……
//}//也去掉


有什么不妥呢?
sinall 2006-09-10
  • 打赏
  • 举报
回复
sinall您说的这些我都知道,C#里的命名空间我还是比较懂的,这里就更没问题了
——————————————————————————————————————————
呵呵,你要是懂的话,就不会有些问题了。
我说“直接打开iostream文件看看。”不知道你有没有看?
如果你看了的话,你会发现:
——————————————————————————————————————————
// iostream
……
#include <istream>
……
——————————————————————————————————————————
// istream
……
#include <ostream>
……
——————————————————————————————————————————
// ostream
……
template<class _E, class _Tr = char_traits<_E> >
class basic_ostream : virtual public basic_ios<_E, _Tr> {
……
};
——————————————————————————————————————————
由此可见:
1)cout当然是ostream的一个实例或者你可以认为是一个实例的引用。
2)ostream不一定定义在iostream中,但是如果你递归地展开iostream的话,肯定会有它的声明。否则,一个没有声明的类,如何访问其成员方法???比如重载的<<
3)有上面可以看出,basic_ostream是个模板类,在VC下,它的实现只能在头文件中,所以,它的实现没有被编译成库文件。
4)它的实现在ostream这个文件中。
5)所以iostream中有它的声明和实现。
primerfly 2006-09-10
  • 打赏
  • 举报
回复
书上确实有这个问题的讨论
ModoRang 2006-09-10
  • 打赏
  • 举报
回复
真的学了些东西,看完。


晨星 2006-09-10
  • 打赏
  • 举报
回复
模板类一般其实现也都放在头文件中了。
roger_77 2006-09-10
  • 打赏
  • 举报
回复
同意楼上的
风轻扬 2006-09-09
  • 打赏
  • 举报
回复
我觉得晨星说得有道理。

sinall您说的这些我都知道,C#里的命名空间我还是比较懂的,这里就更没问题了

OOPhaisky你说的我倒想跟您讨论一下,cout对象的声明在iostream文件中,这个我也知道,但要说cout的实现,它不是ostream类的一个实例吗,那ostream这个类不就是定义在iostream这个文件中的吗,所以才会有include操作吗,那现在您说它的实现被编译成了库文件,那意思不是说ostream这个类的实现被编译成了库文件吗?我现在突然有了一个问题,ostream这个类是在哪个文件中实现的呢?iostream这个文件里是只有ostream这个类的声明,还是既有声明又有实现呢?
OOPhaisky 2006-09-09
  • 打赏
  • 举报
回复
iostream这个文件中包含了cout对象的声明,cout的定义在实现文件中而且已经被编译成了库文件。
但是cout被定义在namespace std中,所以需要using namespace std一下,或者直接std::cout也可以。
sinall 2006-09-09
  • 打赏
  • 举报
回复
直接打开iostream文件看看。

#include<iostream> // 包含iostream,编译器会把iostream中内容替换这条语句
using namespace std; // 打开命名空间std,
// std命名空间内的定义的类、函数等就可以直接访问,
// 而不需要用std::这种方式来访问了。
void main()
{
cout << "hello world!"; // 如果没有#include<iostream>,cout是未定义的;
// 如果没有using namespace std;,
// 你就得这样写了:std::cout << "hello world!";
}
晨星 2006-09-09
  • 打赏
  • 举报
回复
有一点说错了,不是定义,是声明。

相当于在iostream中,有这些语句:

//iostream
……
namespace std {
  ……
  extern ostream cout;
  ……
}
晨星 2006-09-09
  • 打赏
  • 举报
回复
iostream头文件确实包含了cout这个对象的定义。
但在iostream里,这个对象并非定义在全局范围中,而是定义在了一个叫“std”在命命空间中。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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