Ⅰ c++命名空间在哪里定义源文件还是头文件定义了怎么调用std是默认系统命名空间吗
都可以,不用调用,如果在源文件里定义棚耐卜了,当前cpp就能够亩拿使用该命名空间的方法
如果在头文件定义,比如在header.h里面写了using namespace std;
那么在cpp里#include"header.h"同链穗样可以使用其中的方法
并不是默认的,如果没有using namespace std这句话
那么在cin、cout等就要写成std::cin>>
std::cout<<
这样,如果写了那句话,就可以直接cin>>和cout<<
Ⅱ c++ 关于命名空间,头文件里面有一个相当于声明的名称空间,而代码文件又定义一个相同的名称空间
命名空间的主要作用是限制重名,即在不同的命名空间中可以使用相同的名字。
例如上海可以有【中山路】,北京也可以有【中山路】,广州也可以有【中山路】。
虽然大家的路名都是【中山路】。但是只要提供了命名空间--城市名,就可以将这几条路区分开来。
在头文件中,我们需要使用命名空间对函数进行限定。
//test.h
namespacetest{
voidfunc();
}
在代码文件中,虽然我们引用了磨蔽test.h,但是如果不在func也放在同样命名空态仔间中,就会导致编译器认为这是两个函数。
//test.cpp
#include"test.h"
namespacetest{
voidfunc()
{
//TODO
}
}
voidfunc()//←这是一瞎闭州个全局的func,和test命名空间中的func是两个函数。
{
//TODO
}
Ⅲ C++中,头文件与命名空间的关系
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
有些书说有些头文件不在std里是什么意思?std里包含些什么?为什么不用std就不能使用cout?头文件中声明的东西为什么在使用的时候需要先using namespace std;一下?
解析:
######################################
有些书说有些头文件不在std里是什么意思?
######################################
那些书那样说会造成困惑,因为名字空间,就像函数、
结构、类等等,是用代码来表达的一种语言机制。
std(standard的缩写)是标准C++里必须存在的一个
名字空间的名字。所有实现标准C++的编译器都
必须确保这空间的存在。
名字空间声明是这样表达的:
namespace x {
创建新名字
}
x是该名字空间的名字。
头文件装代码,代码表达名字空间。
所以应该说“有些头文件的内容不在std里”。
具体的意思就是,在那些头文件里,
没有任何代码是在“namespace std { }”的括号里的。
######################################
std里包含些什么?
######################################
std里包含标准C++库里的所有名字(类名、
函数名、...)。
######################################
为什么不用std就不能使用cout?
######################################
不是不能使用,只是不能直接写cout,必需用空间名和
名字空间限制符作为前缀,写成std::cout。
用某个名字做名字空间声明的时候,若已有同名的
名字空间存在,就是仅仅把括号里的名字加进去,
否则先创建空间,后加入括号里的名字。
加入名字空间后的名字都是对全局空间隐藏的,
但该名字空间的名字却不隐藏(除非该空间在另一个
名字空间里)。
cout隐藏在std里,但std本身不隐藏,所以
你“#include<iostream>”了之后,不必做
使用声明便可直接用std,通过它访问cout。
若你做了使用声明,对该使用声明所处的作用域的隐藏便
被抵消(作用域的开端到声明之间的那段除外),
即不必使用空间名和名字空间限制符作为前缀。
######################################
头文件中声明的东西为什么在使用的时候需要
先using namespace std;一下?
######################################
你已经知道做使用声明是要讨个方便而不是一种必要。
我们作个总结性的复习吧。
(A)这简单的程序里只有全局和局部空间,没有其它的名字空间:
void main( ) {
std::cout << ""; 错误:std不存在。
cout << ""; 错误:std不存在cout就不用提了。
}
(B)这个则多了一个叫std的名字空间。std这名字也可见了:
#include<iostream>
void main( ) {
std::cout << ""; OK:可通过std骚扰cout。
cout << ""; 错误:cout仍然被包在std里面,不可见。
}
iostream头文件里有std的声明。在编译闹州搜之前,
预处理器会用iostream里的全部内容来代替
“#include<iostream>”这个预处理器指示符。
效果是,这程序包含iostream里的所有代码。
include是包含的意思。
包含指示是在全局空间里,所以在指示之后的任何地方,
std这个名字是可见、可访问的。
(C)这个不包含声迹册明std的代码却尝试打液历开std包,
落了个跟(A)一样狼狈的下场:
using namespace std;
void main( ) {
std::cout << ""; 错误:std不存在。
cout << ""; 错误:std不存在cout就不用提了。
}
(D)这个声明了std(曝露了std)并把std打开,
让里面的名字(cin、cout、cerr、...)跟
std一样暴露。
[相信你闭上眼都能写出这段代码了]
Ⅳ c++命名空间的问题
你没有理解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
namespaceA{
classB{};
}
//file2.h
namespaceA{
classC{};
}
//classB、C都属于一个namespaceA中,但却分属于不同的头文件
你最后提到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实现:
namespacestd{
……
classostream{
……
ostream&operator<<氏颂(ostream&,conststring&);
……
}
……
ostreamcout;
}
简单来说cout已经是一个实例化的对象了,相当于System类下的out,而<<才是他的方法(操作符重载),相当于print()。
简单来说 std::cout<<" ";相当于java.lang.System.out.print(“ ”);
(如果要完全等价的话,要把cout 放入classostream中作为成员,就变成std::ostream::cout<<" ";)
至于std,就是一个标准库。你可以认为是相同功能的类组成一个namespace,坦厅但对于一个库来说按功能细分成小的namespace是不合理的,使用相当不便,所以一个库就使用一个namespace,表示属于这个库的集合,和其他不同的库进行区分,比如boost库就用boost做namespace,C++大部分库都有自己的命名空间,可以去了解下。
如果是自己编程,就可以按功能定义一个namespace,比如一个Data的namespace,里面可以放Year、Month、Data类等,还有一些辅助函数等等。不必像库一样把功能不同的类也放到一起,然后统一用一个namespace。