Ⅰ 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。