第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用STD名稱空間

使用STD名稱空間

C++
郎朗坤 2019-06-24 11:02:27
使用STD名稱空間對于STD名稱空間使用“似乎有不同的看法。有人說用‘using namespace std,另一些人則說,不要使用前綴STD函數,這些函數將與‘一起使用。std::“當其他人說使用類似的東西時:using std::string;using std::cout;using std::cin;using std::endl;using std::vector;對于將要使用的所有STD函數。每種方法的優(yōu)缺點是什么?
查看完整描述

3 回答

?
阿波羅的戰(zhàn)車

TA貢獻1862條經驗 獲得超6個贊

排除基本內容(必須添加std:infront所有stl對象/函數,如果沒有“使用命名空間std”,則沖突的可能性更小)

同樣值得注意的是,你永遠不應該

using namespace std

在頭文件中,因為它可以傳播到包含該頭文件的所有文件,即使它們不想使用該名稱空間。

在某些情況下,使用這樣的東西是非常有益的

using std::swap

好像有一個專門的交換版本,編譯器將使用它,否則它將回到std:swp上。

如果調用std:swp,則始終使用基本版本,它不會調用優(yōu)化版本(如果存在的話)。


查看完整回答
反對 回復 2019-06-24
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

首先,一些術語:

  • 使用-聲明using std::vector;

  • 使用指令using namespace std;

我覺得用使用-指令只要它們不在頭文件的全局范圍內使用,就可以了。所以

using namespace std;

在您的.cpp文件中并不是一個真正的問題,如果結果是,它完全在您的控制之下(如果需要,甚至可以將它的作用域限定為特定的塊)。我看不出有什么不合理的理由把代碼弄得亂七八糟。std::限定符-它只是一堆視覺噪音。但是,如果您沒有使用std在您的代碼中,我也沒有發(fā)現遺漏指令的問題。這是一個重言式-如果指令沒有必要,那么就沒有必要使用它。

同樣的,如果你能用幾個使用-聲明(而不是使用-指令)中的特定類型。std命名空間,那么就沒有理由不將那些特定的名稱引入到當前的命名空間中。出于同樣的原因,我認為這將是瘋狂和簿記麻煩,有25或30個使用-聲明,而一個單一的使用指令將發(fā)揮同樣的作用。

同時也要記住,有時候使用聲明。參考ScottMeyers的“項目25:考慮支持非拋出交換”,從有效C+,第三版。為了使泛型的模板化函數使用參數化類型的“最佳”交換方法,需要使用聲明和參數依賴查找(也稱為ADL或Koenig查找):

template< typename T >void foo( T& x, T& y){
    using std::swap;     // makes std::swap available in this function

    // do stuff...

    swap( x, y);         // will use a T-specific swap() if it exists,
                         //  otherwise will use std::swap<T>()

    // ...
 }

我認為我們應該研究各種語言的常見習語,這些語言大量使用了名稱空間。例如,Java和C#在很大程度上使用名稱空間(可以說比C+更容易使用)。在這些語言中,名稱空間中使用名稱的最常見方式是將它們以相當于使用指令的形式統(tǒng)合到當前的作用域中。這不會引起廣泛的問題,而且問題的幾次是在“異?!钡幕A上通過完全限定的名稱或別名來處理的,就像在C+中所做的那樣。

Herb Sutter和Andrei Alexandrescu在他們的書“C+編碼標準:101規(guī)則、準則和最佳實踐”中的“第59項:不要在頭文件中或在#include之前編寫名稱空間用法”中這樣說:

簡單地說:您可以而且應該在實現文件中自由地使用聲明和指令之后的命名空間。#include指示和感覺很好。盡管重復了相反的斷言,使用聲明和指令的命名空間并不是邪惡的,它們也沒有違背名稱空間的目的。相反,它們是使名稱空間可用的原因。

Stroupstrup在“C+編程語言第三版”中經常被引用為“不要污染全局名稱空間”。他確實說過(C.14[15]),但提到了C.10.1章,其中他說:

使用-聲明將名稱添加到本地范圍。一個使用指令不;它只是在聲明名稱的作用域中呈現可訪問的名稱。例如:

namespaceX {
    int i , j , k ;}int k ;void f1(){
    int i = 0 ;

    using namespaceX ; // make names from X accessible

    i++; // local i
    j++; // X::j
    k++; // error: X::k or global k ?

    ::k ++; // the global k

    X::k ++; // X’s k}void f2(){
    int i = 0 ;

    using X::i ; // error: i declared twice in f2()
    using X::j ;
    using X::k ; // hides global k

    i++;
    j++; // X::j
    k++; // X::k}

本地聲明的名稱(由普通聲明或使用聲明)隱藏同名的非本地聲明,并且在聲明點檢測到名稱的任何非法重載。

注意歧義錯誤k++在……里面f1()..全局名稱不優(yōu)先于全局范圍內可訪問的名稱空間中的名稱。這提供了防止意外名稱沖突的重要保護,而且-重要的是-確保不會從污染全局命名空間中獲得任何好處。

當聲明許多名稱的庫可以通過使用-指令訪問時,未使用名稱的沖突不被視為錯誤,這是一個很大的優(yōu)勢。

...

我希望與傳統(tǒng)的C和C+程序相比,在使用名稱空間的新程序中使用全局名稱的情況會大大減少。名稱空間的規(guī)則是專門為“懶散”的全局名稱用戶制定的,而不是為了避免污染全局范圍的人而制定的。

如何才能與“全球名稱的懶惰用戶”擁有同樣的優(yōu)勢呢?通過利用use-指令,其中安全使命名空間中的名稱可用于當前范圍。

注意,在std通過正確使用use-指令而使作用域可用的命名空間(方法是將該指令放在#includes)污染全局命名空間。它只是使這些名字容易獲得,并繼續(xù)保護免受沖突。


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 446 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號