中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

iis 建網(wǎng)站手機(jī)訪問百度搜索量怎么查

iis 建網(wǎng)站手機(jī)訪問,百度搜索量怎么查,燈飾 技術(shù)支持 東莞網(wǎng)站建設(shè),東莞市做網(wǎng)站公司前言 在C語言中,命名沖突通常發(fā)生在不同的作用域中使用了相同的標(biāo)識(shí)符: 全局變量和局部變量同名: 如果在全局作用域和局部作用域中都定義了同名的變量,那么在局部作用域中,全局變量會(huì)被局部變量遮蔽。 int globalVar; // 全局變量…

前言

在C語言中,命名沖突通常發(fā)生在不同的作用域中使用了相同的標(biāo)識(shí)符:

  1. 全局變量和局部變量同名: 如果在全局作用域和局部作用域中都定義了同名的變量,那么在局部作用域中,全局變量會(huì)被局部變量遮蔽。

    int globalVar; // 全局變量void someFunction() {int globalVar = 10; // 局部變量,遮蔽了全局變量
    }
    
  2. 函數(shù)參數(shù)和局部變量同名: 如果在函數(shù)參數(shù)列表中定義了一個(gè)參數(shù),然后在函數(shù)體中又定義了一個(gè)同名的局部變量,那么參數(shù)會(huì)被局部變量遮蔽。

    void someFunction(int localVar) {int localVar = 20; // 局部變量,遮蔽了函數(shù)參數(shù)
    }
    
  3. 宏定義和變量名沖突: 如果使用#define定義了一個(gè)宏,而這個(gè)宏的名字和某個(gè)變量名相同,那么在宏展開時(shí)可能會(huì)導(dǎo)致命名沖突。

    #define MAX 100 // 宏定義int MAX; // 變量定義,與宏定義沖突
    
  4. 不同文件中的全局變量同名: 如果在不同的源文件中定義了同名的全局變量,并且這些文件被編譯到同一個(gè)程序中,那么鏈接時(shí)可能會(huì)發(fā)生命名沖突。

    // file1.c
    int globalVar;// file2.c
    int globalVar;
    
  5. 結(jié)構(gòu)體和變量名沖突: 如果在同一個(gè)作用域中定義了一個(gè)結(jié)構(gòu)體和一個(gè)同名的變量,那么結(jié)構(gòu)體的名稱會(huì)被變量名遮蔽。

    struct MyStruct {int a;
    };struct MyStruct myVar; // 變量名,遮蔽了結(jié)構(gòu)體名struct MyStruct *ptr; // 錯(cuò)誤:這里會(huì)報(bào)錯(cuò),因?yàn)镸yStruct被遮蔽了
    
  6. typedef和變量名沖突: 如果使用typedef定義了一個(gè)類型,而這個(gè)類型的名字和某個(gè)變量名相同,那么在定義變量時(shí)可能會(huì)導(dǎo)致命名沖突。

    typedef int MyInt;MyInt myVar; // 變量定義int MyInt; // 錯(cuò)誤:這里會(huì)報(bào)錯(cuò),因?yàn)镸yInt被遮蔽了
    

為了解決這一問題,Cpp添加了一個(gè)特性,namespace,命名空間,也有稱作名字空間,通過namespace的特性來減少對(duì)變量名的污染。

文章目錄

    • 前言
    • 命名空間
      • 創(chuàng)建一個(gè)命名空間
      • 未命名的命名空間
        • 友元
      • 使用命名空間
        • 作用域解析
        • 使用指令
        • 使用聲明
      • 命名空間的使用
    • 小結(jié)

命名空間

把一個(gè)全局命名空間分成多個(gè)可管理的小空間。關(guān)鍵字namespace,如同class、struct、enum和union一樣,把它們的成員的命名放到了不同的空間中去,與其他的關(guān)鍵字目的不同的是,namespace唯一一的目的是產(chǎn)生一個(gè)新的命名空間。

創(chuàng)建一個(gè)命名空間

創(chuàng)建一個(gè)命名空間與創(chuàng)建一個(gè)類非常相似:

// C10:MyLib.cpp
namespace MyLib {// Declarations
}
int main() {}

這就產(chǎn)生了一個(gè)新的命名空間,其中包含了各種聲明。然而,namespace與class、struct、union和enum有明顯的區(qū)別:

  • namespace只能在全局范圍內(nèi)定義,但它們之間可以互相嵌套。
  • 在namespace定義的結(jié)尾,右花括號(hào)的后面不必跟一個(gè)分號(hào)。
  • 一個(gè)namespace可以在多個(gè)頭文件中用一個(gè)標(biāo)識(shí)符來定義,就好像重復(fù)定義一個(gè)類一樣。
// C10:Header1.h
#ifndef HEADER1_H
#define HEADER1_H
namespace MyLib {extern int x;void f();
}
#endif // HEADER1_H
// C10:Header2.h
#ifndef HEADER2_H
#define HEADER2_H
#include "Header1.h"
// Add more names to MyLib
namespace MyLib { // NOT a redefinition!extern int y;void g();
}
#endif // HEADER2_H
// C10:Continuation.cpp
#include "Header2.h"
int main() {}
  • 一個(gè)namespace的命名可以用另一個(gè)命名來作它的別名,這樣就不必敲那些開發(fā)商提供的冗長(zhǎng)的命名了。
// C10:BobsSuperDuperLibrary.cpp
namespace BobsSuperDuperLibrary {class Widget { /*...*/ };class Poppit { /*...*/ };//...
}
// Too much to type! I'll alias it:
namespace Bcb = BobsSuperDuperLibrary;
int main() {}

未命名的命名空間

每個(gè)翻譯單元都可包含一個(gè)未命名的命名空間——可以不用標(biāo)識(shí)符而只用“namespace”再加一個(gè)命名空間。

// C10:UnnamedNamespaces.cpp
namespace {class Arm { /*...*/ };class Leg { /*...*/ };class Head { /*...*/ };class Robot {Arm arm[4];Leg leg[16];Head head[3];//...};
}
int main() {}

在這個(gè)空間中的命名自動(dòng)地在翻譯單元內(nèi)無限制地有效。但要確保每個(gè)翻譯單元只有一個(gè)未命名的命名空間。如果把一個(gè)局部命名放在一個(gè)未命名的命名空間中,不需要加上static說明就可以讓它們作內(nèi)部連接。

友元

可以在一個(gè)命名空間的類定義之內(nèi)插入(inject)一個(gè)友元(friend)聲明:

// C10:FriendInjection.cpp
namespace Me {class Us {//...friend void you();};
}
int main() {}

這樣函數(shù)you()就成了命名空間Me的一個(gè)成員。

使用命名空間

在一個(gè)命名空間中引用一個(gè)命名可以采取三種方法:第一種方法是用作用域運(yùn)算符,第二種方法是用using指令把所有命名引入到命名空間中,第三種方法是用using聲明一次性引用命名

作用域解析

命名空間中的任何命名都可以用作用域運(yùn)算法則明確地指定,就像引用一個(gè)類中的命名一樣,學(xué)過java的人員也會(huì)想到一個(gè)包package的概念,namespace也像package一樣,但:

  1. Java 的 package 與文件系統(tǒng)結(jié)構(gòu)緊密相關(guān),而 C++ 的 namespace 則不強(qiáng)制要求與文件系統(tǒng)結(jié)構(gòu)對(duì)應(yīng)。
  2. 訪問控制:Java 的 package 通過訪問修飾符和 package 聲明來控制訪問權(quán)限,而 C# 和 C++ 的 namespace 主要用于組織代碼,訪問控制由訪問修飾符決定。
// C10:ScopeResolution.cpp
namespace X {class Y {static int i;public:void f();};class Z {void func();public:int X::Y::i = 9;class X::Z {int u, v, w;public:Z(int i);int g();};int X::Z::g() { return u = v = w = 0; }void X::func() {Z a(1);a.g();}}int main() {}
}

注意定義X::Y::i就像引用一個(gè)類Y的數(shù)據(jù)成員一樣容易,Y如同被嵌套在類X中而不像是被嵌套在命名空間X中。

到目前為止,命名空間看上去很像類。

使用指令

用using關(guān)鍵字可以讓我們立即進(jìn)入整個(gè)命名空間,擺脫輸入一個(gè)命名空間中完整標(biāo)識(shí)符的麻煩。這種using和namespace關(guān)鍵字的搭配使用稱為使用指令(using directive)。using關(guān)鍵字聲明了一個(gè)命名空間中的所有命名是在當(dāng)前范圍內(nèi),所以可以很方便地使用這些未限定的命名。如果以一個(gè)簡(jiǎn)單的命名空間開始:

// C10:NamespaceInt.h
#ifndef NAMESPACEINT_H
#define NAMESPACEINT_H
namespace Int {enum sign { positive, negative };class Integer {int i;sign s;public:Integer(int ii = 0) : i(ii), s(i >= 0? positive : negative) {}sign sign() const { return s; }};
}
#endif // NAMESPACEINT_H
// C10:NamespaceOverriding1.cpp
#include "NamespaceMath.h"
int main() {using namespace Math;Integer a; // Hides Math::aa.setSign(negative);// Now scope resolution is necessary// to select Math::a:Math::a.setSign(positive);
}

如果有第二個(gè)命名空間,它包含命名空間Math的某些命名:

// C10:NamespaceOverriding2.cpp
#ifndef NAMESPACEOVERRIDING2_H
#define NAMESPACEOVERRIDING2_H
#include "NamespaceInt.h"
namespace Calculation {using namespace Int;Integer divide(Integer, Integer);
}
#endif // NAMESPACEOVERRIDING2_H

因?yàn)檫@個(gè)命名空間也是用using指令來引入的,這樣就可能產(chǎn)生沖突。不過,這種二義性出現(xiàn)在命名的使用時(shí),而不是在using指令使用時(shí)。

// C10:OverridingAmbiguity.cpp
#include "NamespaceMath.h"
#include "NamespaceOverriding2.h"
void s() {using namespace Math;using namespace Calculation;// Everything's ok until:// divide(1, 2); // Ambiguity
}
int main() {}

這樣,即使永遠(yuǎn)不產(chǎn)生歧義性,使用using指令引入帶命名沖突的命名空間也是可能的。

使用聲明

可以用使用聲明(using declaration)一次性引入到當(dāng)前范圍內(nèi)。這種方法不像using指令那樣把那些命名當(dāng)成當(dāng)前范圍的全局名來看待,using聲明是在當(dāng)前范圍之內(nèi)進(jìn)行的一個(gè)聲明,這就意味著在這個(gè)范圍內(nèi)它可以不顧來自u(píng)sing指令的命名。

// C10:UsingDeclaration.h
#ifndef USINGDECLARATION_H
#define USINGDECLARATION_H
namespace U {inline void f() {}inline void g() {}
}
namespace V {inline void f() {}inline void g() {}
}
namespace V {inline void f() {}inline void g() {}
}
#endif // USINGDECLARATION_H
// C10:UsingDeclaration1.cpp
#include "UsingDeclaration.h"
void h() {using namespace U; // Directiveusing V::f; // Declarationf(); // Calls V::f();U::f(); // Must fully qualify to call
}
// C10:UsingDeclaration2.cpp
#include "UsingDeclaration.h"
void m() {using namespace Q;f(); // Calls U::f();g(); // Calls V::g();
}
int main() {}

一個(gè)using聲明是一個(gè)別名,它允許在不同的命名空間聲明同樣的函數(shù)。如果不想由于引入不同命名空間而導(dǎo)致重復(fù)定義一個(gè)函數(shù)時(shí),可以使用using聲明,它不會(huì)引起任何二義性和重復(fù)。

命名空間的使用

上面所介紹的一些規(guī)則剛開始時(shí)也許會(huì)使我們感到氣餒,特別是當(dāng)我們知道將來一直使用它們會(huì)有什么感覺時(shí),尤其如此。一般說來,只要真正理解了它們的工作機(jī)理,使用它們也會(huì)變得非常簡(jiǎn)單。需要記住的關(guān)鍵問題是當(dāng)引入一個(gè)全局using指令時(shí)(可以在任何范圍之外通過使用namespace),就已經(jīng)為那個(gè)文件打開了該命名空間。對(duì)于一個(gè)實(shí)現(xiàn)文件(一個(gè).cpp文件)來說,這通常是一個(gè)好方法,因?yàn)橹挥性谠撐募幾g結(jié)束時(shí),using指令才會(huì)起作用。也就是說,它不會(huì)影響任何其他的文件,所以可以每次在一個(gè)實(shí)現(xiàn)文件中調(diào)整對(duì)命名空間的控制。 例如,如果發(fā)現(xiàn)由于在一個(gè)特定的實(shí)現(xiàn)文件中使用太多的using指令而產(chǎn)生命名沖突,就要對(duì)該文件做簡(jiǎn)單的改變,以致使用明確的限定或者using聲明來消除命名沖突,這樣不用修改其他的實(shí)現(xiàn)文件。

頭文件的情況與此不同。不要把一個(gè)全局的using指令引入到一個(gè)頭文件中,因?yàn)槟菍⒁馕吨@個(gè)頭文件的任何其他頭文件也會(huì)打開這個(gè)命名空間(頭文件可以被另一個(gè)頭文件包含)。

所以,在頭文件中,最好使用明確的限定或者被限定在一定范圍內(nèi)的using指令和using聲明。在本專欄中將討論這種用法,通過這種方法,就不會(huì)“污染”全局命名空間和退到C++的命名空間引入前的世界。

小結(jié)

雖然命名可以嵌套在類中,但全局函數(shù)、全局變量以及類的命名還是在同一個(gè)全局命名空間中。雖然static關(guān)鍵字可以使變量和函數(shù)進(jìn)行內(nèi)部連接(使它們文件靜態(tài),從而做到一定的控制。但在一個(gè)大項(xiàng)目中,如果對(duì)全局的命名空間缺乏控制就會(huì)引起很多問題。為了解決這些問題,開發(fā)商常常使用冗長(zhǎng)、難懂的命名,以使沖突減少,但這樣我們不得不一個(gè)一個(gè)地敲這些命名(typedef常常用來簡(jiǎn)化這些命名),namespace的要求也就應(yīng)運(yùn)而生,它可以使我們的變量名稱和函數(shù)名稱變得更短,雖然不一定清晰,但是可以在一定程度上減少?zèng)_突。利用using 指令的時(shí)候,我們要考慮是否會(huì)對(duì)該變量名稱是否會(huì)對(duì)后續(xù)的程序產(chǎn)生一定的影響,畢竟using指令是全局作用產(chǎn)生的,如果會(huì)對(duì)后續(xù)程序產(chǎn)生影響,我們就用作用域解析,這時(shí)候就像一個(gè)類一樣,雖然說稍稍麻煩了一些,但是我們還是可以解決命名沖突的問題————畢竟這就是namespace這一特性存在的原因。

http://m.risenshineclean.com/news/65372.html

相關(guān)文章:

  • 邯鄲資訊seo入門版
  • 怎樣制作免費(fèi)個(gè)人網(wǎng)頁seo優(yōu)化方案案例
  • 網(wǎng)站建設(shè)與web應(yīng)用開發(fā)技術(shù)網(wǎng)站做成app
  • 網(wǎng)站開發(fā) 打標(biāo)簽市場(chǎng)策劃方案
  • 榆垡網(wǎng)站建設(shè)商洛網(wǎng)站建設(shè)
  • 網(wǎng)站建設(shè)文字內(nèi)容免費(fèi)投放廣告平臺(tái)
  • 快站網(wǎng)如何開始建站建站模板網(wǎng)站
  • 做譯員的網(wǎng)站近期新聞熱點(diǎn)大事件
  • 咸寧網(wǎng)站建設(shè)公司谷歌搜索引擎免費(fèi)入口鏡像
  • 讓路由器做網(wǎng)站服務(wù)器互聯(lián)網(wǎng)廣告優(yōu)化
  • 江蘇網(wǎng)站建設(shè)重慶店鋪整站優(yōu)化
  • 注冊(cè)網(wǎng)站怎么做seo專員
  • 甘肅做高端網(wǎng)站常用的搜索引擎有
  • 成華網(wǎng)站制作萬網(wǎng)商標(biāo)查詢
  • 興寧電子商務(wù)網(wǎng)站建設(shè)seo內(nèi)容優(yōu)化方法
  • 編寫網(wǎng)站策劃方案自助建站系統(tǒng)破解版
  • 福田網(wǎng)站 建設(shè)seo信科免費(fèi)發(fā)布產(chǎn)品的網(wǎng)站
  • b2c網(wǎng)站前臺(tái)系統(tǒng)主要包括哪幾個(gè)部分長(zhǎng)春seo顧問
  • 網(wǎng)站開發(fā)有什么好的命題站長(zhǎng)工具綜合查詢ip
  • wordpress next page系統(tǒng)優(yōu)化
  • 做網(wǎng)站除了有服務(wù)器還需要什么軟件個(gè)人推廣平臺(tái)
  • 自己可以做招聘的網(wǎng)站嗎百度推廣登陸首頁
  • 做網(wǎng)站后期要收維護(hù)費(fèi)嗎新鄭網(wǎng)絡(luò)推廣
  • 建設(shè)企業(yè)網(wǎng)站首頁天津優(yōu)化代理
  • 做交通事故的網(wǎng)站b2b網(wǎng)站有哪些
  • 做網(wǎng)站學(xué)哪個(gè)語言最好百度平臺(tái)電話多少
  • 瀟朋友免費(fèi)班級(jí)網(wǎng)站建設(shè)系統(tǒng)交換友鏈平臺(tái)
  • 有哪些好的做網(wǎng)站公司網(wǎng)絡(luò)上如何推廣網(wǎng)站
  • 網(wǎng)站建設(shè)需要學(xué)習(xí)課程推銷網(wǎng)站
  • 用于做網(wǎng)站的軟件微信朋友圈推廣平臺(tái)