c++命名空间的问题

新学c++,对namespace的理解不深刻,晚上查的答案都不是我想要的,希望这里高手们能帮我解答。c++所有的头文件,也就是不带.h的,都需要命名空间吗?命名空间除了s... 新学c++,对namespace的理解不深刻,晚上查的答案都不是我想要的,希望这里高手们能帮我解答。
c++所有的头文件,也就是不带.h的,都需要命名空间吗?
命名空间除了std,还有别的什么?
头文件和命名空间谁包含谁?是std是iostream里面的命名空间之一,还是iostream是可用std的头文件之一?
iostream中的cout是否是相当于java里基本类中的一个方法,include相当于import,std::相当于system.out.,cout相当于print(),可以这么理解吗?
展开
 我来答
Adol1111
推荐于2016-01-09 · TA获得超过948个赞
知道小有建树答主
回答量:218
采纳率:0%
帮助的人:329万
展开全部
  • 你没有理解C++的namespace。如果你熟悉java的话,你可以这样理解,java中用包机制取代了所谓的命名空间。在java中一般是一个类一个文件的(原则上说多个类放一个文件下也没问题),然后相同功能的一组类文件组合成了一个包。

    在C++中,namespace就相当于java中的包,单纯的头文件是不需要命名空间的,如果你想把多个类、辅助函数等等组合成一个整体,就用namespace。

  • 命名空间是防止名称碰撞的机制,比如我有一个class A,你也有一个class A,那么我们在同一个程序下的话到底是用你的A还是我的A?在C++中就这样用I::A、Y::A,而java中则是I.A,Y.A

  • 不需要.h的头文件,是C++的标准头文件,里面都包含了namespace std,如果是标准出现前的C++头文件,如<iostream.h>这些都不包含namespace,那个时候还没这个概念。新的头文件是标准出现后重写的,防止命名碰撞问题(VC++6.0是标准之前的编译器,允许使用旧版的头文件,但这些都不包含namespace,而新编译器都不再使用带.h的C++标准头文件)如果是C的头文件,如<stdio.h>就不包含namespace,C++重写的C的头文件都包含std,名称为<cXXX>,如<cstdio>

  • 至于谁包涵谁的问题就很难说清楚了,因为namespace虽然一般都是用在头文件中的(规范使用是在头文件中),但是一个头文件不一定需要namespace,而且一个namespace可以包涵多个不同头文件。我举个例子:

//file1.h
namespace A{
    class B{};
}
//file2.h
namespace A{
    class C{};
}
//class B、C 都属于一个namespace A中,但却分属于不同的头文件


  • 你最后提到mport相当于include,你可以这样认为,但又有不同。首先从2者的实现机制来看,import是引入一个包或者引入包下的某个类文件,include只引入头文件(java中没有头文件,所以是实现和声明一起引入的,C++中实现和头文件是拆开的,include只包含声明部分,实现是由链接器最后链接组成的)

    其次 java中的 import 既包含了包的引入,又开放了包的命名。比如import java.swing.*; 你用JFrame类时就不用写javax.swing.Frame了,只要写JFrame;但C++中include只包含了声明的引入,要想开放命名空间需要using指令,如using namespace std 或using std::cout,然后就能直接写  cout了,否则每次都要写std::cout

  • 至于你说的std::相当于System.out.,是完全不对的。因为System是属于java.lang这个包下的一个类,而out是类下的一个成员对象。java.lang.才相当于std::

    而cout和print()是有本质区别的,这个你可以看下《C++ primer》或者《C++程序设计语言(十周年纪念版)》(这2本书都对namespace有清楚的解释,建议看一下),我简单解释下吧,以下是简化版本的cout实现:

namespace std{
    ……
    class ostream{
    ……
    ostream& operator<<(ostream&,const string&);
    ……
    }
    ……
    ostream cout;
}

简单来说cout已经是一个实例化的对象了,相当于System类下的out,而<<才是他的方法(操作符重载),相当于print()。

简单来说 std::cout<<"  ";相当于java.lang.System.out.print(“ ”);

(如果要完全等价的话,要把cout 放入class ostream中作为成员,就变成std::ostream::cout<<"  ";)


  • 至于std,就是一个标准库。你可以认为是相同功能的类组成一个namespace,但对于一个库来说按功能细分成小的namespace是不合理的,使用相当不便,所以一个库就使用一个namespace,表示属于这个库的集合,和其他不同的库进行区分,比如boost库就用boost做namespace,C++大部分库都有自己的命名空间,可以去了解下。

    如果是自己编程,就可以按功能定义一个namespace,比如一个Data的namespace,里面可以放Year、Month、Data类等,还有一些辅助函数等等。不必像库一样把功能不同的类也放到一起,然后统一用一个namespace。

lixinjie241
2013-07-24 · 超过11用户采纳过TA的回答
知道答主
回答量:63
采纳率:0%
帮助的人:35.4万
展开全部
  1. C++中大部分头文件都是不需要命名空间的,只有很少的一部分需要如<iostream>\<string>\<vector>.... 他们都是需要的std命名空间;

  2. 命名空间很多,但是毕竟常用的还是std,还有CFile等等;

  3. 谁包含谁都是可以的,你把命名空间声明在类的内部就可以说是类包含命名空间,这就有点类似于全局变量和成员变量,命名空间的目的也就是为了解决变量名混乱的问题; STL大家族的.h 文件基本都需要使用std命名空间;

  4. 我对Java不熟,其实命名空间只是相当于变量的一个识别符,比如C程序中定义全局变量定义的两个变量重名了,你在用的时候就没法用了,但是如果两个变量都加了命名空间你就可以有选择的使用它们;

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暮鼓晨钟cy
2013-07-24 · TA获得超过282个赞
知道小有建树答主
回答量:205
采纳率:100%
帮助的人:55.5万
展开全部
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中
<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中

我觉得你对于java和C++的理解没有错,反正我也是这么理解的,百度发现一些网友的理解也和我们一样,应该是对的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
彭珂的课堂
2021-05-06 · IT资讯、技能教学、学习经验分享。
彭珂的课堂
采纳数:98 获赞数:343

向TA提问 私信TA
展开全部

C++_007_头文件和std命名空间_上

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式