一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當(dāng)前位置: > 關(guān)注 > > 正文

【快播報(bào)】為什么需要命名空間?使用命名空間解決名字沖突

來(lái)源:CSDN 時(shí)間:2022-12-09 15:28:54

??一、為什么需要命名空間(問(wèn)題提出)

命名空間是ANSIC++引入的可以由用戶(hù)命名的作用域,用來(lái)處理程序中常見(jiàn)的同名沖突。

在 C語(yǔ)言中定義了3個(gè)層次的作用域,即文件(編譯單元)、函數(shù)和復(fù)合語(yǔ)句。C++又引入了類(lèi)作用域,類(lèi)是出現(xiàn)在文件內(nèi)的。在不同的作用域中可以定義相同名字的變量,互不于擾,系統(tǒng)能夠區(qū)別它們。


(資料圖)

1、全局變量的作用域是整個(gè)程序,在同一作用域中不應(yīng)有兩個(gè)或多個(gè)同名的實(shí)體(enuty),包括變量、函數(shù)和類(lèi)等。

例:如果在文件中定義了兩個(gè)類(lèi),在這兩個(gè)類(lèi)中可以有同名的函數(shù)。在引用時(shí),為了區(qū)別,應(yīng)該加上類(lèi)名作為限定:

class A//聲明A類(lèi)

{public:

void funl();//聲明A類(lèi)中的funl函數(shù)

private:

int i; };

void A::funl() //定義A類(lèi)中的funl函數(shù)

{…………}

class B //聲明B類(lèi)

{public:

void funl(); //B類(lèi)中也有funl函數(shù)

void fun2(); };

void B::funl() //定義B類(lèi)中的funl函數(shù)

{ …………}

這樣不會(huì)發(fā)生混淆。

在文件中可以定義全局變量(global variable),它的作用域是整個(gè)程序。如果在文件A中定義了一個(gè)變量aint a=3;

在文件B中可以再定義一個(gè)變量aint a=5;

在分別對(duì)文件A和文件B進(jìn)行編譯時(shí)不會(huì)有問(wèn)題。但是,如果一個(gè)程序包括文件A和文件B,那么在進(jìn)行連接時(shí),會(huì)報(bào)告出錯(cuò),因?yàn)樵谕粋€(gè)程序中有兩個(gè)同名的變量,認(rèn)為是對(duì)變量的重復(fù)定義。

可以通過(guò)extern聲明同一程序中的兩個(gè)文件中的同名變量是同一個(gè)變量。如果在文件B中有以下聲明:

extem int a;

表示文件B中的變量a是在其他文件中已定義的變量。由于有此聲明,在程序編譯和連接后,文件A的變量a的作用域擴(kuò)展到了文件B。如果在文件B中不再對(duì)a賦值,則在文件B中用以下語(yǔ)句輸出的是文件A中變量a的值: cout<<A; 得到a的值為3<="" p="">

2、程序中就會(huì)出現(xiàn)名字沖突。

在簡(jiǎn)單的程序設(shè)計(jì)中,只要人們小心注意,可以爭(zhēng)取不發(fā)生錯(cuò)誤。但是,一個(gè)大型的應(yīng)用軟件,往往不是由一個(gè)人獨(dú)立完成的,而是由若干人合作完成的,不同的人分別完成不同的部分,最后組合成一個(gè)完整的程序。假如不同的人分別定義了類(lèi),放在不同的頭文件中,在主文件(包含主函數(shù)的文件)需要用這些類(lèi)時(shí),就用#include命令行將這些頭文件包含進(jìn)來(lái)。由于各頭文件是由不同的人設(shè)計(jì)的,有可能在不同的頭文件中用了相同的名字來(lái)命名所定義的類(lèi)或函數(shù)。

例4 名字沖突

程序員甲在頭文件headerl.h中定義了類(lèi) Student和函數(shù)fun。

// 例4中的頭文件header1(頭文件1,沒(méi)其文件名為cc8-4-h1.h)

#include

#include

using namespace std;

class Student //聲明Student類(lèi)

{public:

Student(int n,string nam,int a)

{num=n;name=nam;age=a;}

void get_data();

private:

int num;

string name;

int age; };

void Student::get_data() //成員函數(shù)定義

{ cout<<NUM<<" p="" ?<<name<double fun(double a,double b)//定義全局函數(shù)(即外部函數(shù))

{ return sqrt(a+b);}

在 main函數(shù)所在的文件中包含頭文件headerl.h:

#include

using namespace std;

#include "header1.h" //注意要用雙引號(hào),因?yàn)槲募话闶欠旁谟糜脩?hù)目錄中的

int main()

{Student stud1(101,"Wang",18); //定義類(lèi)對(duì)象studl

stud1.get_data();

cout<<FUN(5,3)<<ENDL;< p="">

return 0; }

程序 能正常運(yùn)行,輸出為

101 Wang 18

2.82843

如果程序員乙寫(xiě)了頭文件header2.h,在其中除了定義其他類(lèi)以外,還定義了類(lèi)Student和函數(shù)fun,但其內(nèi)容與頭文件headerl.h中的 Student和函數(shù)fun有所不同。

// 例4中的頭文件header2

#include

#include

using namespace std;

class Student //聲明Student類(lèi)

{ public:

Student(int n,string nam,char s) //參數(shù)與headerl中的student不同

{ num=n;name=nam;sex=s;}

void get_data();

private:

int num;

string name;

char sex; };//此項(xiàng)與headerl不同

void Student::get_data() //成員函數(shù)定義

{ cout<<NUM<<" p="" ?<<name<

double fun(double a,double b) //定義全局函數(shù)

{ return sqrt(a-b);} //返回值與headerl中的fun函數(shù)不同

//頭文件2中可能還有其他內(nèi)容

假如主程序員在其程序中要用到headerl.h中的Student和函數(shù)fun,因而在程序中包含了頭文件headerl.h,同時(shí)要用到頭文件 header2.h中的一些內(nèi)容(但對(duì)header2.h中包含與headerl.h中的Student類(lèi)和fun函數(shù)同名而內(nèi)容不同的類(lèi)和函數(shù)并不知情,因?yàn)樵谝粋€(gè)頭文件中往往包含許多不同的信息,而使用者往往只關(guān)心自己所需要的部分,而不注意其他內(nèi)容),因而在程序中又包含了頭文件 header2.h。如果主文件(包含主函數(shù)的文件)如下:

#include

using namespace std;

#include "header1.h"http://包含頭文件l

#include "header2.h"http://包含頭文件2

int main()

{ Student stud1(101,"Wang",18);

stud1.get_data();

cout<<FUN(5,3)<<ENDL;< p="">

return 0; }

這時(shí)程序編譯就會(huì)出錯(cuò)。因?yàn)樵陬A(yù)編譯后,頭文件中的內(nèi)容取代了對(duì)應(yīng)的#include命令行,這樣就在同一個(gè)程序文件中出現(xiàn)了兩個(gè)Student類(lèi)和兩個(gè) fun函數(shù),顯然是重復(fù)定義,這就是名字沖突,即在同一個(gè)作用域中有兩個(gè)或多個(gè)同名的實(shí)體。

3、全局命名空間污染(global namespace pollution)。

在程序中還往往需要引用一些庫(kù)(包括C++編譯系統(tǒng)提供的庫(kù)、由軟件開(kāi)發(fā)商提供的庫(kù)或者用戶(hù)自己開(kāi)發(fā)的庫(kù)),為此需要包含有關(guān)的頭文件。如果在這些庫(kù)中包含有與程序的全局實(shí)體同名的實(shí)體,或者不同的庫(kù)中有相同的實(shí)體名,則在編譯時(shí)就會(huì)出現(xiàn)名字沖突。

為了避免這類(lèi)問(wèn)題的出現(xiàn),人們提出了許多方法,例如:將實(shí)體的名字寫(xiě)得長(zhǎng)—些(包含十幾個(gè)或幾十個(gè)字母和字符);把名字起得特殊一些,包括一些特殊的字符;由編譯系統(tǒng)提供的內(nèi)部全局標(biāo)識(shí)符都用下劃線作為前綴,如_complex(),以避免與用戶(hù)命名的實(shí)體同名;由軟件開(kāi)發(fā)商提供的實(shí)體的名字用特定的字符作為前綴。但是這樣的效果并不理想,而且增加了閱讀程序的難度,可讀性降低了。

C 語(yǔ)言和早期的C++語(yǔ)言沒(méi)有提供有效的機(jī)制來(lái)解決這個(gè)問(wèn)題,沒(méi)有使庫(kù)的提供者能夠建立自己的命名空間的工具。人們希望ANSI C++標(biāo)準(zhǔn)能夠解決這個(gè)問(wèn)題,提供—種機(jī)制、一種工具,使由庫(kù)的設(shè)計(jì)者命名的全局標(biāo)識(shí)符能夠和程序的全局實(shí)體名以及其他庫(kù)的全局標(biāo)識(shí)符區(qū)別開(kāi)來(lái)。

二、什么是命名空間(解 決方案)

命名空間:實(shí)際上就是一個(gè)由程序設(shè)計(jì)者命名的內(nèi)存區(qū)域,程序設(shè)計(jì)者可以根據(jù)需要指定一些有名字的空間域,把一些全局實(shí)體分別放在各個(gè)命名空間中,從而與其他全局實(shí)體分隔開(kāi)來(lái)。

如: namespace ns1 //指定命名中間nsl

{ int a;

double b; }

namespace 是定義命名空間所必須寫(xiě)的關(guān)鍵字,nsl 是用戶(hù)自己指定的命名空間的名字(可以用任意的合法標(biāo)識(shí)符,這里用ns1是因?yàn)閚s是namespace的縮寫(xiě),含義請(qǐng)楚),在花括號(hào)內(nèi)是聲明塊,在其中聲明的實(shí)體稱(chēng)為命名空間成員(namespace member)。現(xiàn)在命名空間成員包括變量a和b,注意a和b仍然是全局變量,僅僅是把它們隱藏在指定的命名空間中而已。如果在程序中要使用變量a和b,必須加上命名空間名和作用域分辨符“::”,如nsl::a,nsl::b。這種用法稱(chēng)為命名空間限定(qualified),這些名字(如nsl::a)稱(chēng)為被限定名 (qualified name)。C++中命名空間的作用類(lèi)似于操作系統(tǒng)中的目錄和文件的關(guān)系,由于文件很多,不便管理,而且容易重名,于是人們?cè)O(shè)立若干子目錄,把文件分別放到不同的子目錄中,不同子目錄中的文件可以同名。調(diào)用文件時(shí)應(yīng)指出文件路徑。

命名空間的作用:是建立一些互相分隔的作用域,把一些全局實(shí)體分隔開(kāi)來(lái)。以免產(chǎn)生老點(diǎn)名叫李相國(guó)時(shí),3個(gè)人都站起來(lái)應(yīng)答,這就是名字沖突,因?yàn)樗麄儫o(wú)法辨別老師想叫的是哪一個(gè)李相國(guó),同名者無(wú)法互相區(qū)分。為了避免同名混淆,學(xué)校把3個(gè)同名的學(xué)生分在3個(gè)班。這樣,在小班點(diǎn)名叫李相國(guó)時(shí),只會(huì)有一個(gè)人應(yīng)答。也就是說(shuō),在該班的范圍(即班作用域)內(nèi)名字是惟一的。如果在全校集合時(shí)校長(zhǎng)點(diǎn)名,需要在全校范圍內(nèi)找這個(gè)學(xué)生,就需要考慮作用域問(wèn)題。如果校長(zhǎng)叫李相國(guó),全校學(xué)生中又會(huì)有3人一齊喊“到”,因?yàn)樵谕蛔饔糜蛑写嬖?個(gè)同名學(xué)生。為了在全校范圍內(nèi)區(qū)分這3名學(xué)生,校長(zhǎng)必須在名字前加上班號(hào),如高三甲班的李相國(guó),或高三乙班的李相國(guó),即加上班名限定。這樣就不致產(chǎn)生混淆。

可以根據(jù)需要設(shè)置許多個(gè)命名空間,每個(gè)命名空間名代表一個(gè)不同的命名空間域,不同的命名空間不能同名。這樣,可以把不同的庫(kù)中的實(shí)體放到不同的命名空間中,或者說(shuō),用不同的命名空間把不同的實(shí)體隱蔽起來(lái)。過(guò)去我們用的全局變量可以理解為全局命名空間,獨(dú)立于所有有名的命名空間之外,它是不需要用 namespace聲明的,實(shí)際上是由系統(tǒng)隱式聲明的,存在于每個(gè)程序之中。

在聲明一個(gè)命名空間時(shí),花括號(hào)內(nèi)不僅可以包括變量,而且還可以包括以下類(lèi)型:

·變量(可以帶有初始化);

·常量;

·數(shù)(可以是定義或聲明);

·結(jié)構(gòu)體;

·類(lèi);

·模板;

·命名空間(在一個(gè)命名空間中又定義一個(gè)命名空間,即嵌套的命名空間)。

例如

namespace nsl

{const int RATE=0.08; //常量

doublepay;//變量

doubletax()//函數(shù)

{return a*RATE;}

namespacens2//嵌套的命名空間

{int age;}

}

如果想輸出命名空間nsl中成員的數(shù)據(jù),可以采用下面的方法:

cout<<nsl::rate<<endl;< p="">

cout<<nsl::pay<<endl;< p="">

cout<<nsl::tax()<<endl;< p="">

cout<<nsl::ns2::age<<endl; p="" 需要指定外層的和內(nèi)層的命名中間名<="">

可以看到命名空間的聲明方法和使用方法與類(lèi)差不多。但它們之間有一點(diǎn)差別:在聲明類(lèi)時(shí)在右花括號(hào)的后面有一分號(hào),而在定義命名空間時(shí),花括號(hào)的后面沒(méi)有分號(hào)。

三、使用命名空間解決名字沖突(使用指南)

有了以上的基礎(chǔ)后,就可以利用命名空間來(lái)解決名字沖突問(wèn)題。現(xiàn)在,對(duì)例4程序進(jìn)行修改,使之能正確運(yùn)行。

例5 利用命名空間來(lái)解決例4程序名字沖突問(wèn)題。

修改兩個(gè)頭文件,把在頭文件中聲明的類(lèi)分別放在兩個(gè)不同的命名空間中。

//例8.5中的頭文件1,文件名為header1.h

using namespace std;

#include

#include

namespace ns1 //聲明命名空間ns1

{ class Student //在命名空間nsl內(nèi)聲明Student類(lèi)

{ public:

Student(int n,string nam,int a)

{ num=n;name=nam;age=a;}

void get_data();

private:

int num;

string name;

int age; };

void Student::get_data() //定義成員函數(shù)

{ cout<<NUM<<" p="" ?<<name<

double fun(double a,double b) //在命名空間n引內(nèi)定義fun函數(shù)

{ return sqrt(a+b);}

}

//例 8.5中的頭文件2,文件名為header2.h

#include

#include

namespace ns2 //聲明命名空間ns2

{ class Student

{ public:

Student(int n,string nam,char s)

{ num=n;name=nam;sex=s;}

void get_data();

private:

int num;

string name;

char sex; };

void Student::get_data()

{ cout<<NUM<<" p="" ?<<name<

double fun(double a,double b)

{ return sqrt(a-b);}

}

//main file

#include

#include "header1.h" //包含頭文件l

#include "header2.h" //包含頭文件2

int main()

{ ns1::Student stud1(101,"Wang",18);//用命名空間nsl中聲明的Student類(lèi)定義studt

stud1.get_data(); //不要寫(xiě)成ns1::studl.get_data();

cout<<ns1::fun(5,3)<<endl; p="" 調(diào)用命名空間ns1中的fun函數(shù)<="">

ns2::Student stud2(102,"Li","f"); //用命名空間ns2中聲明的 Student類(lèi)定義stud2

stud2.get_data();

cout<<ns2::fun(5,3)<<endl; p="" 調(diào)用命名空間nsl,中的fun函數(shù)<="">

return 0; }

解決本題的關(guān)鍵是建立了兩個(gè)命名空間nsl和ns2,將原來(lái)在兩個(gè)頭文件中聲叫的類(lèi)分別放在命名空間nsl和ns2中。注意:在頭文件中,不要把#include命令放在命名空間中,在上一小節(jié)的敘述中可以知道,命名空間中的內(nèi)容不包括命令行,否則編譯會(huì)出錯(cuò)。

分析例4程序出錯(cuò)的原因是:在兩個(gè)頭文件中有相同的類(lèi)名Student和相同的函數(shù)名fun,在把它們包含在主文件中時(shí),就產(chǎn)生名字沖突,存在重復(fù)定義。編譯系統(tǒng)無(wú)法辨別用哪一個(gè)頭文件中的Student來(lái)定義對(duì)象studl。現(xiàn)在兩個(gè)Student和fun分別放在不同的命名空間中,各自有其作用域,互不相干。由于作用域不相同,不會(huì)產(chǎn):生名字沖突。正如同在兩個(gè)不同的類(lèi)中可以有同名的變量和函數(shù)而不會(huì)產(chǎn)生沖突一樣。

在定義對(duì)象時(shí)用ns1::Student(命名空間nsl中的Student)來(lái)定義studl,用ns2::Student(命名空間ns2中的 Student)來(lái)定義stud2。顯然,nsl::Student和ns2::Student是兩個(gè)不同的類(lèi),不會(huì)產(chǎn)生混淆。同樣,在調(diào)用fun函數(shù)時(shí)也需要用命名空間名ns]或ns2加以限定。ns1::fun()和ns2::fun()是兩個(gè)不同的函數(shù)。注意:對(duì)象studl是用 nsl::Student定義的,但對(duì)象studl并不在命名空間nsl中。studl的作用域?yàn)閙ain函數(shù)范圍內(nèi)。在調(diào)用對(duì)象studl的成員函數(shù) get_data時(shí),應(yīng)寫(xiě)成studl.get_data(),而不應(yīng)寫(xiě)成nsl::studl.get_data()。

程序 能順利通過(guò)編譯,并得到以下運(yùn)行結(jié)果:

101 Wang l9 (對(duì)象studl中的數(shù)據(jù))

2.82843 (/5+3的值)

102 Li f (對(duì)象studg中的數(shù)據(jù))

1.41421 (/5-2的值)

四、使用命名空間成員的方法

從上面的介紹可以知道,在引用命名空間成員時(shí),要用命名空間名和作用域分辨符對(duì)命名空間成員進(jìn)行限定,以區(qū)別不同的命名空間中的同名標(biāo)識(shí)符。即:

命名空間名::命名空間成員名

這種方法是有效的,能保證所引用的實(shí)體有惟一的名字。但是如果命名空間名字比較長(zhǎng),尤其在有命名空間嵌套的情況下,為引用一個(gè)實(shí)體,需要寫(xiě)很長(zhǎng)的名字。在一個(gè)程序中可能要多次引用命名空間成員,就會(huì)感到很不方便。

1 、使用命名空間別名

可以為命名空間起一個(gè)別名(namespace alias),用來(lái)代替較長(zhǎng)的命名空間名。如

namespace Television //聲明命名空間,名為T(mén)elevision

{ ... }

可以用一個(gè)較短而易記的別名代替它。如:

namespace TV=Television; //別名TV與原名Television等價(jià)

也可以說(shuō),別名TV指向原名Television,在原來(lái)出現(xiàn)Television的位置都可以無(wú)條件地用TV來(lái)代替。

2、使用using命名空間成員名

using后面的命名空間成員名必須是由命名空間限定的名字。例如:

using nsl::Student;

以上語(yǔ)句聲明:在本作用域(using語(yǔ)句所在的作用域)中會(huì)用到命名空間ns1中的成員Student,在本作用域中如果使用該命名空間成員時(shí),不必再用命名空間限定。例如在用上面的using聲明后,在其后程序中出現(xiàn)的Student就是隱含地指nsl::Student。

using聲明的有效范圍是從using語(yǔ)句開(kāi)始到using所在的作用域結(jié)束。如果在以上的using語(yǔ)句之后有以下語(yǔ)句:

Student studl(101,"Wang",18); //此處的Student相當(dāng)于ns1::Student

上面的語(yǔ)句相當(dāng)于

nsl::Student studl(101,"Wang",18);

又如

using nsl::fun; //聲明其后出現(xiàn)的fun是屬于命名空間nsl中的fun

cout<<FUN(5,3)<<ENDL; p="" 此處處的fun函數(shù)相當(dāng)于nsl::fun(5,3)<="">

顯然,這可以避免在每一次引用命名空間成員時(shí)都用命名空間限定,使得引用命名空間成員變得方便易用。

但是要注意:在同一作用域中用using聲明的不同命名空間的成員中不能有同名的成員。例如:

usmgnsl::Student; //聲明其后出現(xiàn)的Student是命名空間nsl中的Student

usmgns2::Student; //聲明其后出現(xiàn)的Student是命名空間ns2小的Student

Student stud1; //請(qǐng)問(wèn)此處的Student是哪個(gè)命名中間中的Student?

產(chǎn)生了二義性,編譯出錯(cuò)。

3、使用using namespace命名空間名

用上面介紹的using命名空間成員名,一次只能聲明一個(gè)命名空間成員,如果在一個(gè)命名空間中定義了10個(gè)實(shí)體,就需要使用10次using命名空間成員名。能否在程序中用一個(gè)語(yǔ)句就能一次聲明一個(gè)命名空間中的全部成員呢?

C++提供了using namespace語(yǔ)句來(lái)實(shí)現(xiàn)這一目的。using namespace語(yǔ)句的一般格式為

using namespace 命名空間名;

例如

using nanlespace nsl;

聲明了在本作用域中要用到命名空間nsl中的成員,在使用該命名空間的任何成員時(shí)都不必用命名空間限定。如果在作了上面的聲明后有以下語(yǔ)句:

Student studl(101,”Wang”,18); //Student隱含指命名中間nsl中的Student

cout<<FUN(5,3)<<ENDL; p="" 這里的fun函數(shù)是命名中間="" nsl中的fun函數(shù)<="">

在用usmgnamespace聲明的作用域中,命名空間nsl的成員就好像在全局域聲明的一樣。因此可以不必用命名空間限定。顯然這樣的處理對(duì)寫(xiě)程序比較方便。但是如果同時(shí)用usingnamespace聲明多個(gè)命名空間時(shí),往往容易出錯(cuò)。例5中的main函數(shù)如果用下面程序段代替,就會(huì)出錯(cuò)。

int main()

{ using namespace nsl;//聲明nsl中的成員在本作用域中可用

using namespace ns2;//聲明ns2中的成員在本作用域中可用

Student studl(101,”Wang",18);

studl.8ct_data();

cout<<FUN(5,3)<<ENDL;< p="">

Student stud2(102,"Li","r");

stud2.get_data();

coutt<<FUN(5,3)<<ENDL;< p="">

return O; }

因?yàn)樵谕蛔饔糜蛑型瑫r(shí)引入了兩個(gè)命名空間nsl和ns2,其中有同名的類(lèi)和函數(shù)。在出現(xiàn)Student時(shí),無(wú)法判定是哪個(gè)命名空間中的 Student,出現(xiàn)二義性,編譯出錯(cuò)。因此只有在使用命名空間數(shù)量很少,以及確保這些命名空間中沒(méi)有同名成員時(shí)才用using namespace語(yǔ)句。

五、無(wú)名的命名空間

以上介紹的是有名字的命名空間,C++還允許使用沒(méi)有名字的命名空間,如在文件A中聲明了以下的無(wú)名命名空間:

namespace //命名空間沒(méi)有名字

{ void fun( ) //定 義命名空間成員

{ cout<<"OK."<<ENDL;}< p="">

}

由于命名空間沒(méi)有名字,在其他文件中顯然無(wú)法引用,它只在本文件的作用域內(nèi)有效。無(wú)名命名空間的成員fun函數(shù)的作用域?yàn)槲募嗀(確切地說(shuō),是從聲明無(wú)名命名空間的位置開(kāi)始到文件A結(jié)束)。在文件A中使用無(wú)名命名空間的成員,不必(也無(wú)法)用命名空間名限定。

如果 在文件A中有以下語(yǔ)句:

fun();

則執(zhí)行無(wú)名命名空間中的成員fun函數(shù),輸出”O(jiān)K.”。

在本程序中的其他文件中也無(wú)法使用該fun函數(shù),也就是把fun函數(shù)的作用域限制在本文件范圍中。可以聯(lián)想到:在C浯言中可以用static聲明一個(gè)函數(shù),其作用也是使該函數(shù)的作用域限于本文件。C++保留了用static聲明函數(shù)的用法,同時(shí)提供了用無(wú)名命名空間來(lái)實(shí)現(xiàn)這一功能。隨著越來(lái)越多的C++ 編譯系統(tǒng)實(shí)現(xiàn)了ANSI C++建議的命名空間的機(jī)制,相信使用無(wú)名命名空間成員的方法將會(huì)取代以前習(xí)慣用的對(duì)全局變量的靜態(tài)聲明。

六、標(biāo)準(zhǔn)命名空間std

為了解決C++標(biāo)準(zhǔn)庫(kù)中的標(biāo)識(shí)符與程序中的全局標(biāo)識(shí)符之間以及不同庫(kù)中的標(biāo)識(shí)符之間的同名沖突,應(yīng)該將不同庫(kù)的標(biāo)識(shí)符在不同的命名空間中定義(或聲明)。標(biāo)準(zhǔn)C++庫(kù)的所有的標(biāo)識(shí)符都是在一個(gè)名為std的命名空間中定義的,或者說(shuō)標(biāo)準(zhǔn)頭文件(如iostream)中函數(shù)、類(lèi)、對(duì)象和類(lèi)模板是在命名空間 std中定義的。std是standard(標(biāo)準(zhǔn))的縮寫(xiě),表示這是存放標(biāo)準(zhǔn)庫(kù)的有關(guān)內(nèi)容的命名空間,含義請(qǐng)楚,不必死記。

這樣,在程序中用到C++標(biāo)準(zhǔn)庫(kù)時(shí),需要使用std作為限定。如

std::cout<<"OK."<<ENDL; p="" 聲明cout是在命名空間std中定義的流對(duì)象<="">

在有的C++書(shū)中可以看到這樣的用法。但是在每個(gè)cout,cm以及其他在std中定義的標(biāo)識(shí)符前面都用命名空間std作為限定,顯然是很不方便的。在大多數(shù)的C++程序中常用usmgnamespace語(yǔ)句對(duì)命名空間std進(jìn)行聲明,這樣可以不必對(duì)每個(gè)命名空間成員一進(jìn)行處理,在文件的開(kāi)頭加入以下 using namespace聲明:

using namespace std;

這樣,在std中定義和聲明的所有標(biāo)識(shí)符在本文件中都可以作為全局量來(lái)使用。但是應(yīng)當(dāng)絕對(duì)保證在程序中不出現(xiàn)與命名空間std的成員同名的標(biāo)識(shí)符,例如在程序中不能再定義一個(gè)名為cout的對(duì)象。由于在命名空間std中定義的實(shí)體實(shí)在太多,有時(shí)程序設(shè)計(jì)人員也弄不請(qǐng)哪些標(biāo)識(shí)符已在命名空間std中定義過(guò),為減少出錯(cuò)機(jī)會(huì),有的專(zhuān)業(yè)人員喜歡用若干個(gè)"using命名空間成員”聲明來(lái)代替“using namespace命名空間”聲明,如

using Std::string;

using Std::cout;

using Std::cin;

等。為了減少在每一個(gè)程序中都要重復(fù)書(shū)寫(xiě)以亡的using聲明,程序開(kāi)發(fā)者往往把編寫(xiě)應(yīng)用程序時(shí)經(jīng)常會(huì)用到的命名空間std成員的usmg聲明組成一個(gè)頭文件,然后在程序中包含此頭文件即可。

如果閱讀了多種介紹C++的書(shū),可能會(huì)發(fā)現(xiàn)有的書(shū)的程序中有using namespace語(yǔ)句,有的則沒(méi)有。有的讀者會(huì)提出:究竟應(yīng)該有還是應(yīng)該沒(méi)有?應(yīng)當(dāng)說(shuō):用標(biāo)準(zhǔn)的C++編程,是應(yīng)該對(duì)命名空間std的成員進(jìn)行聲明或限定的(可以采取前面介紹過(guò)的任一種方法)。但是目前所用的C++庫(kù)大多是幾年前開(kāi)發(fā)的,當(dāng)時(shí)并沒(méi)有命名空間,庫(kù)中的有關(guān)內(nèi)容也沒(méi)有放在std命名空間中,因而在程序中不必對(duì)std進(jìn)行聲明。

七、使用早期的函數(shù)庫(kù)

C語(yǔ)言程序中各種功能基本上都是由函數(shù)來(lái)實(shí)現(xiàn)的,在C語(yǔ)言的發(fā)展過(guò)程中建立了功能豐富的函數(shù)庫(kù),C++從C語(yǔ)言繼承了這份寶貴的財(cái)富。在C++程序中可以使用C語(yǔ)言的函數(shù)庫(kù)。

如果要用函數(shù)庫(kù)中的函數(shù),就必須在程序文件中包含有關(guān)的頭文件,在不同的頭文件中,包含了不同的函數(shù)的聲明。

在C++中使用這些 頭文件有兩種方法。

1、用C語(yǔ)言的傳統(tǒng)方法

頭文件名包括后綴.h,如stdio.h,math.h等。由于C語(yǔ)言沒(méi)有命名空間,頭文件并不存放在命名空間中,因此在C++程序文件中如果用到帶后綴.h的頭文件時(shí),不必用命名空間。只需在文件中包含所用的頭文件即可。如

#include

2、用C++的新方法

C++標(biāo)準(zhǔn)要求系統(tǒng)提供的頭文件不包括后綴.h,例如iostream、string。為了表示與C 語(yǔ)言的頭文件有聯(lián)系又有區(qū)別,C++所用的頭文件名是在C語(yǔ)言的相應(yīng)的頭文件名(但不包括后綴.h)之前加一字母c。例如,C語(yǔ)言中有關(guān)輸入與輸出的頭文件名為stdio.h在C++中相應(yīng)的頭文件名為cstdio。C語(yǔ)言中的頭文件math.h,在C++中相應(yīng)的頭文什名為cmath。C語(yǔ)言中的頭文件 string.h在C++中相應(yīng)的頭文件名為cstring。注意在C++中,頭文件cstnng和頭文件strmg不是同一個(gè)文件。前者提供C語(yǔ)言中對(duì)字符串處理的有關(guān)函數(shù)(如strcmp,ctrcpy)的聲明,后者提供C++中對(duì)字符串處理的新功能。

此外,由于這些函數(shù)都是在命名空間std中聲明的,因此在程序中要對(duì)命名空間std作聲明。如:

#include

#include

using namespace std;

目前所用的大多數(shù)C++編譯系統(tǒng)既保留了c的用法,又提供丁C++的新方法。下面兩種用法等價(jià),可以任選。

C傳 統(tǒng)方法 C++新方法

#include #include

#include #include

#include #include

using namespace std;

可以使用傳統(tǒng)的c方法,但應(yīng)當(dāng)提倡使用C++的新方法。

責(zé)任編輯:

標(biāo)簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top 一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四
欧美亚洲在线播放| 欧美日韩美女一区二区| 免费观看日韩av| 国产精品欧美一区喷水| 99在线|亚洲一区二区| 欧美成人综合| 91久久精品国产91久久| 欧美成人午夜激情在线| 亚洲国产精品激情在线观看| 久久国产精品99国产精| 国产小视频国产精品| 欧美一区2区三区4区公司二百| 国产精品一区二区久久精品| 亚洲欧美日本国产专区一区| 国产美女精品免费电影| 久久电影一区| 在线国产亚洲欧美| 久久一区亚洲| 亚洲黑丝在线| 欧美午夜激情小视频| 亚洲欧美日韩高清| 国产在线观看精品一区二区三区 | 亚洲一品av免费观看| 国产精品久久国产三级国电话系列| 在线综合视频| 国产欧美日韩一区二区三区在线观看 | 欧美午夜久久久| 亚洲一二三区精品| 国产欧美一二三区| 久久久久久国产精品mv| 在线日韩视频| 欧美日韩岛国| 午夜国产精品影院在线观看| 国产日韩在线一区二区三区| 久久久精品欧美丰满| **性色生活片久久毛片| 欧美男人的天堂| 亚洲欧美日韩精品久久亚洲区 | 国产精品综合网站| 久久精品日产第一区二区三区| 在线观看视频日韩| 欧美日韩日本国产亚洲在线| 午夜精品视频在线| 有坂深雪在线一区| 欧美三级特黄| 老**午夜毛片一区二区三区| 一本综合久久| 国产亚洲综合在线| 欧美精品一区二区久久婷婷| 午夜免费电影一区在线观看| 亚洲国产欧美久久| 国产精品国产三级国产专播品爱网| 久久精品国产清自在天天线| 日韩午夜中文字幕| 国产综合婷婷| 国产精品xnxxcom| 免费亚洲婷婷| 久久riav二区三区| 在线一区日本视频| 亚洲第一在线视频| 国产欧美日韩麻豆91| 欧美日韩国产黄| 久久久久久久成人| 亚洲永久免费av| 91久久久精品| 国产一区二区成人| 国产精品r级在线| 免费日韩av片| 久久激情婷婷| 亚洲影院在线| 日韩一级成人av| 亚洲国产综合91精品麻豆| 国产欧美日韩综合| 欧美午夜电影在线| 麻豆精品在线播放| 久久精品国产久精国产一老狼| 宅男精品视频| 日韩亚洲欧美一区| 亚洲黄页视频免费观看| 黑人巨大精品欧美黑白配亚洲| 国产精品成人国产乱一区| 欧美精品福利在线| 欧美 日韩 国产一区二区在线视频 | 国产欧美精品在线播放| 欧美高清日韩| 久久综合九色综合久99| 性色av一区二区三区红粉影视| 一本久道久久综合狠狠爱| 亚洲第一视频| 在线日韩av| 曰韩精品一区二区| 国内精品久久久久久久97牛牛| 国产精品久线观看视频| 欧美日韩妖精视频| 欧美日韩国产精品一区二区亚洲| 免费在线观看一区二区| 久久久www| 久久久国产一区二区| 久久大综合网| 欧美在线视频一区二区三区| 欧美亚洲三级| 性色一区二区| 欧美在线亚洲一区| 欧美一区不卡| 久久激情综合| 久久这里只精品最新地址| 久久精品综合网| 久久久久久尹人网香蕉| 久久九九热re6这里有精品| 久久激情网站| 久久综合色婷婷| 欧美国产在线观看| 欧美日韩精品免费观看视频| 欧美剧在线观看| 欧美色视频在线| 国产精品美女主播在线观看纯欲| 国产精品每日更新在线播放网址| 国产精品国产成人国产三级| 国产精品乱码人人做人人爱| 国产精品自拍网站| 国内精品伊人久久久久av影院 | 欧美激情aaaa| 欧美三日本三级少妇三2023 | 亚洲精选91| 亚洲深夜激情| 久久不射2019中文字幕| 久久久午夜视频| 欧美精品一区二区视频| 国产精品video| 国产综合精品一区| 亚洲国产成人tv| 一个色综合导航| 欧美影院成人| 欧美国产视频日韩| 国产精品午夜国产小视频| 国语自产精品视频在线看8查询8| 亚洲国产精品久久人人爱蜜臀| 99精品国产99久久久久久福利| 亚洲欧美日本在线| 六月天综合网| 国产精品扒开腿爽爽爽视频| 国产午夜一区二区三区| 1769国内精品视频在线播放| 一本色道久久综合狠狠躁的推荐| 欧美影院午夜播放| 欧美国产日本高清在线| 国产伦精品一区二区三区照片91| 亚洲福利一区| 亚洲欧美久久久久一区二区三区| 久久亚洲综合色| 国产精品二区影院| 尤物视频一区二区| 亚洲一区二区三区中文字幕在线| 久久全球大尺度高清视频| 欧美精品久久一区| 国产主播一区二区三区| 一本大道av伊人久久综合| 久久精品官网| 欧美午夜欧美| 亚洲日本免费电影| 久久精品人人做人人爽| 国产精品扒开腿做爽爽爽视频| 在线看无码的免费网站| 亚洲欧美日本另类| 欧美日韩精品在线| 亚洲大黄网站| 久久精品99国产精品日本| 国产精品jizz在线观看美国| 91久久精品国产91久久| 久久精品一区二区三区不卡| 国产精品美女久久久久久久 | 海角社区69精品视频| 亚洲视频狠狠| 欧美国产激情二区三区| 韩国成人精品a∨在线观看| 亚洲视频免费在线观看| 欧美成人在线免费观看| 国内精品久久久久伊人av| 亚洲一区www| 欧美日韩一区二区视频在线观看| 亚洲高清成人| 久久免费的精品国产v∧| 国产精品日韩精品| 一区二区三区成人精品| 欧美激情一区二区三级高清视频| 狠狠色伊人亚洲综合网站色| 欧美一区二区三区四区高清| 国产精品日韩精品欧美在线| 亚洲视频免费观看| 欧美日韩中文在线观看| 9l视频自拍蝌蚪9l视频成人| 欧美国产日产韩国视频| 亚洲国产另类精品专区| 久久综合久久久久88| 精东粉嫩av免费一区二区三区| 亚洲嫩草精品久久| 国产精品99一区| 亚洲一本视频| 国产精品网站一区| 亚洲免费视频观看|