亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++箴言:理解Terminology術語

2019-11-17 05:11:06
字體:
來源:轉載
供稿:網友

  這是一個所有程序員都應該了解的小型的 C++ 詞匯表。下面的條目都足夠重要,值得我們對它們的含義務必取得完全一致。

  聲明(declaration)告訴編譯器關于某物的名字和類型,但它省略了某些細節。以下這些都是聲明:

extern int x; // object declaration

std::size_t numDigits(int number); // function declaration

class Widget; // class declaration

template<typename T> // template declaration
class GraphNode; // (see Item 42 for info on
// the use of "typename")

  注重即使是內建類型,我還是更喜歡將整數看作一個 "object",某些人將 "object" 這個名字保留給用戶定義類型,但我不是他們中的一員。再有就是注重函數 numDigits 的返回類型是 std::size_t,也就是說,namespace std 中的 size_t 類型。這個 namespace 是 C++ 標準庫中每一樣東西實際所在的地方。但是,因為 C 標準庫(嚴謹地說,來自于 C89)在 C++ 中也能使用,從 C 繼續來的符號(諸如 size_t)可能存在于全局范圍,std 內部,或兩者都有,這依靠于哪一個頭文件被 #included。在本書中,我假設 C++ 頭文件被 #included,這也就是為什么我用 std::size_t 代替 size_t 的原因。當行文中涉及到標準庫組件時,我一般不再提及 std,這依靠于你認可類似 size_t,vector,以及 cout 之類的東西都在 std 中,在示例代碼中,我總是包含 std,因為真正的代碼沒有它將無法編譯。

  順便說一下,size_t 僅僅是某些供 C++ 對某物計數時使用的 unsigned 類型的 typedef(例如,一個基于 char* 的 string 中字符的個數,一個 STL 容器中元素的個數,等等)。它也是 vector,deque,以及 string 的 Operator[] 函數所持有的類型,這是一個在 Item 3 中定義我們自己的 operator[] 函數時將要遵守的慣例。

  每一個函數的聲明都表明了它的識別標志(signature),也就是它的參數和返回類型。一個函數的識別標志(signature)與它的類型相同。對于 numDigits 的情況,識別標志(signature)是 std::size_t (int),也就是說,“函數持有一個 int,并返回一個 std::size_t”。官方的“識別標志(signature)”的 C++ 定義排除了函數的返回類型,但是在本書中,將返回類型考慮為識別標志的一部分更加有用。

  定義(definition)為編譯器提供在聲明時被省略的細節。對于一個對象,定義是編譯器為對象留出內存的地方。對于一個函數或一個函數模板,定義提供代碼本體。對于一個類或一個類模板,定義列出了類或者模板的成員:

int x; // object definition

std::size_t numDigits(int number) // function definition.
{
  // (This function returns
  std::size_t digitsSoFar = 1; // the number of digits
  // in its parameter.)
  while ((number /= 10) != 0) ++digitsSoFar;
  return digitsSoFar;
}

class Widget {
  // class definition
  public:
   Widget();
   ~Widget();
  ...
};

template<typename T> // template definition
class GraphNode {
public:
  GraphNode();
  ~GraphNode();
  ...
};

  初始化(Initialization)是設定一個對象的第一個值的過程。對于用戶定義類型的對象,初始化通過構造函數完成任務。缺省構造函數(default constrUCtor)就是不需要任何引數(arguments)就可以調用的構造函數。這樣的一個構造函數既可以是沒有參數(parameters),也可以是每一個參數都有缺省值:

class A {
public:
  A(); // default constructor
};

class B {
public:
  eXPlicit B(int x = 0, bool b = true); // default constructor; see below
}; // for info on "explicit"

class C {
public:
  explicit C(int x); // not a default constructor
};

  這里 B 和 C 的構造函數都被聲明為 explicit(顯式的)。這是為了防止它們被用來執行隱式類型轉換(implicit type conversions),雖然他們還可以被用于顯示類型轉換(explicit type conversions):

void doSomething(B bObject); // a function taking an object of
// type B

B bObj1; // an object of type B

doSomething(bObj1); // fine, passes a B to doSomething

B bObj2(28); // fine, creates a B from the int 28
// (the bool defaults to true)

doSomething(28); // error! doSomething takes a B,
// not an int, and there is no
// implicit conversion from int to B

doSomething(B(28)); // fine, uses the B constructor to
// explicitly convert (i.e., cast) the
// int to a B for this call. (See
// Item 27 for info on casting.)

  構造函數被聲明為 explicit(顯式的)通常比 non-explicit(非顯式)的更可取,因為它們可以防止編譯器執行意外的(經常是無意識的)類型轉換。除非我有一個好的理由答應一個構造函數被用于隱式類型轉換(implicit type conversions),否則就將它聲明為 explicit(顯式的)。我希望你能遵循同樣的方針。

  構造函數被聲明為 explicit(顯式的)通常比 non-explicit(非顯式)的更可取,因為它們可以防止編譯器執行意外的(經常是無意識的)類型轉換。除非我有一個好的理由答應一個構造函數被用于隱式類型轉換(implicit type conversions),否則就將它聲明為 explicit(顯式的)。我希望你能遵循同樣的方針。

  請注重我是如何突出上面的示例代碼中的強制轉換(cast)的。貫穿本書,我用這樣的突出引導你注重那些應該注重的材料。(我也突出章節號碼,但那僅僅是因為我想讓它好看一些。)

  拷貝構造函數(copy constructor)被用來以一個對象來初始化同類型的另一個對象,拷貝賦值運算符(copy assignment operator)被用來將一個對象中的值拷貝到同類型的另一個對象中:

class Widget {
public:
  Widget(); // default constructor
  Widget(const Widget& rhs); // copy constructor
  Widget& operator=(const Widget& rhs); // copy assignment operator
  ...
};
Widget w1; // invoke default constructor
Widget w2(w1); // invoke copy constructor
w1 = w2; // invoke copy
// assignment operator

  當你看到什么東西看起來像一個賦值的話,要仔細閱讀,因為 "=" 在語法上還可以被用來調用拷貝構造函數:

Widget w3 = w2; // invoke copy constructor!
  幸運的是,拷貝構造函數很輕易從拷貝賦值中區別出來。假如一個新的對象被定義(就象上面那行代碼中的 w3),一個構造函數必須被調用;它不可能是一個賦值。假如沒有新的對象被定義(就象上面那行 "w1 = w2" 代碼中),沒有構造函數能被調用,所以它就是一個賦值。

  拷貝構造函數是一個非凡重要的函數,因為它定義一個對象如何通過傳值的方式被傳遞。例如,考慮這個:

bool hasAcceptableQuality(Widget w);

...
Widget aWidget;
if (hasAcceptableQuality(aWidget)) ...

  參數 w 通過傳值的方式被傳遞給 hasAcceptableQuality,所以在上面的調用中,aWidget 被拷貝給 w??截悇幼魍ㄟ^ Widget 的拷貝構造函數被執行。通過傳值方式傳遞意味著“調用拷貝構造函數”。(無論如何,通過傳值方式傳遞用戶定義類型通常是一個不好的想法,傳引用給 const 通常是更好的選擇。) 更多文章 更多內容請看C/C++技術專題專題,或
  STL 是標準模板庫(Standard Template Library),作為 C++ 的標準庫的一部分,致力于容器(containers)(例如,vector,list,set,map,等等),迭代器(iterators)(例如,vector<int>::iterator,set<string>::iterator,等等),算法(algorithms)(例如,
for_each,find,sort,等等),以及相關機能。相關機能中的很多都通過函數對象(function objects)——行為表現類似于函數的對象——提供。這樣的對象來自于重載了 operator() ——函數調用運算符——的類,假如你不熟悉 STL,在讀本書的時候,你應該有一本像樣的參考手冊備查,因為對于我來說 STL 太有用了,以至于不能不利用它。一但你用了一點點,你也會有同樣的感覺。

  從 java 或 C# 那樣的語言來到 C++ 的程序員可能會對未定義行為(undefined behavior)的概念感到吃驚。因為各種各樣的原因,C++ 中的一些結構成分(constructs)的行為沒有確切的定義:你不能可靠地預知運行時會發生什么。這里是兩個帶有未定義行為的代碼的例子:

int *p = 0; // p is a null pointer

std::cout << *p; // dereferencing a null pointer
// yields undefined behavior
char name[] = "Darla"; // name is an array of size 6 (don’t
// forget the trailing null!)

char c = name[10]; // referring to an invalid array index
// yields undefined behavior

  為了強調未定義行為的結果是不可預言而且可能是令人討厭的,有經驗的 C++ 程序員經常說帶有未定義行為的程序能(can)刪除你的硬盤。這是真的:一個帶有未定義行為的程序可以(could)刪除你的硬盤。只不過可能性不太大。更可能的是那個程序的表現反復無常,有時會運行正常,有時會徹底完蛋,還有時會產生錯誤的結果。有實力的 C++ 程序員能以最佳狀態避開未定義行為。本書中,我會指出許多你必須要注重它的地方。

  另一個可能把從其它語言轉到 C++ 的程序員搞糊涂的條目是接口(interface)。Java 和 .NET 的語言都將接口作為一種語言要素,但是在 C++ 中沒有這種事。當我使用條目“接口(interface)”時,一般情況下我說的是一個函數的識別標志,是一個類的可訪問元素(例如,一個類的 "public interface","PRotected interface",或 "private interface"),或者是對一個模板的類型參數來說必須合法的表達式。也就是說,我是作為一個相當普遍的設計概念來談論接口(interface)的。

  客戶(client)是使用你寫的代碼(一般是接口(interfaces))的某人或某物。例如,一個函數的客戶就是它的用戶:調用這個函數(或持有它的地址)的代碼的片段以及寫出和維護這樣的代碼的人。類或者模板的客戶是使用這個類或模板的軟件的部件,以及寫出和維護那些代碼的程序員。在討論客戶的時候,我一般指向程序員,因為程序員會被困擾和誤導,或者因為不好的接口而煩惱。但他們寫的代碼卻不會。

  你也許不習慣于為客戶著想,但是我會用大量的時間試圖說服你:你應該盡你所能使他們的生活更輕松。記住,你也是一個其他人開發的軟件的客戶。難道你不希望那些人為你把事情弄得輕松些嗎?除此之外,在某種程度上,你幾乎肯定能發現你自己處在了你自己的客戶的位置上(也就是說,使用你寫的代碼),而這個時候,你會為你在開發你的接口時在頭腦中保持了對客戶的關心而感到興奮。

  我經常掩蓋函數和函數模板之間以及類和類模板之間的區別。那是因為對其中一個確定的事對另一個經常也可以確定。假如不是這樣,我會區別對待類,函數,以及由類和函數產生的模板。

  在代碼注釋中提到構造函數和析構函數時,我有時使用縮寫形式 ctor 和 dtor。

  Naming Conventions 命名慣例

  我試圖為對象,類,函數,模板等選擇意味深長的名字,但是在我的某些名字后面的含義可能不會立即顯現出來。例如,我非凡喜歡的兩個參數名字是 lhs 和 rhs。它們分別代表 "left-hand side" 和 "right-hand side"。我經常用它們作為實現二元運算符的函數(例如,operator== 和 operator*)的參數名。例如,假如 a 和 b 是代表有理數的對象,而且假如 Rational 對象能通過一個非成員的 operator* 函數相乘(Item 24 中解釋的很可能就是這種情況),表達式

a * b
  與函數調用

operator*(a,b)
  就是等價的。

  我也這樣聲明 operator*過:

const Rational operator*(const Rational& lhs, const Rational& rhs);
  你可以看到,左手操作數(left-hand operand)a 在函數內部以 lhs 的面目出現,而右手操作數(right-hand operand)b 以 rhs 的面目出現。

  對于成員函數左手參數(left-hand argument)表現為 this 指針,所以有時候我單獨使用參數名 rhs。
你可能已經在第 5 頁中某些 Widget 成員函數的聲明(本文介紹拷貝構造函數的那一段中的例子——譯者注)中注重到了這一點。這一點提醒了我。我經常在示例中使用 Widget 類。"Widget" 并不意味著什么東西。它僅僅是在我需要一個示例類的名字的時候不時地使用一下的名字。它和 GUI 工具包中的 widgets 沒有任何關系。

  我經常遵循這個規則為指針命名:一個指向類型 T 的對象的指針被稱為 pt,"pointer to T"。以下是例子:

Widget *pw; // pw = ptr to Widget

class Airplane;
Airplane *pa; // pa = ptr to Airplane
class GameCharacter;
GameCharacter *pgc; // pgc = ptr to GameCharacter

  我對引用使用類似的慣例:rw 可以認為是一個引向 Widget 的引用,而 ra 是一個引向 Airplane 的引用。

  在我討論成員函數的時候我偶然會使用名字 mf。

  Threading Considerations 對線程的考慮

  作為一種語言,C++ 沒有線程的概念——實際上,是沒有任何一種并發的概念。對于 C++ 標準庫也是同樣如此。就 C++ 涉及的范圍而言,多線程編程并不存在。

  而且至今它們依然如此。我致力于讓此書基于標準的,可移植的 C++,但我也不能對線程安全(thread safety)已成為很多程序員所面臨的一個問題的事實視而不見。我對付這個標準 C++ 和現實之間的裂痕的方法就是指出某處的 C++ 結構成分(constructs)以我的分析很可能在多線程環境中引起問題的地方。這樣不但不會使本書成為一本用 C++ 進行多線程編程的書。反而,它更會使本書在相當程度上成為這樣一本 C++ 編程的書:將自己在很大程度上限制于單線程考慮,承認多線程的存在,并試圖指出有線程意識的程序員需要非凡當心評估我提供的建議的地方。

  假如你不熟悉多線程編程或者不必為此擔心,你可以忽略我關于線程的討論。假如你正在編寫一個多線程的應用或庫,無論如何,請記住我的評注和并將它作為你使用 C++ 時需要致力去解決的問題的起點。

  TR1 and Boost TR1 和 Boost

  你會發現提及 TR1 和 Boost 的地方遍及整個系列。它們每一個都專門在某些細節上進行描述,但是,不幸的是,這些都在整個系列的最后。(他們在那里是因為那樣更好一些,我確實試過很多其它的地方。)假如你愿意,但是假如你更喜歡從本書的起始處而不是結尾處開始,以下摘要會對你有所幫助:

  ·TR1 ("Technical Report 1") 是被加入 C++ 標準庫的新機能的規格說明書。這些機能以新的類和函數模板的形式提供了諸如哈希表(hash tables),引用計數智能指針(reference-counting smart pointers),正則表達式(regular expressions),等等。所有的 TR1 組件都位于嵌套在 namespace std 內部的 namespace tr1 內。

  ·Boost 是一個組織和一個網站 (http://boost.org) 提供的可移植的,經過同行評審的,開源的 C++ 庫。大多數 TR1 機能都基于 Boost 的工作,而且直到編譯器廠商在他們的 C++ 庫發行版中包含 TR1 之前,Boost 網站很可能會保持開發者尋找 TR1 實現的第一站的地位。Boost 提供的東西比用于 TR1 的更多,無論如何,在很多情況下,它還是值得去了解一下的。 更多文章 更多內容請看C/C++技術專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久在线观看| 91精品国产高清久久久久久91| 亚洲精品国产成人| 尤物九九久久国产精品的特点| 伊人久久大香线蕉av一区二区| 91网站在线看| 欧美日韩亚洲视频一区| 国产成人精品在线播放| 欧美一级电影在线| 在线亚洲国产精品网| 国产精品成熟老女人| 久久天天躁日日躁| 日本精品久久电影| 欧美一区亚洲一区| 欧美在线激情视频| 日韩av综合网| 久久伊人91精品综合网站| 91亚洲精华国产精华| 色综合伊人色综合网| 亚洲精品国产suv| 中文字幕亚洲欧美日韩在线不卡| 日韩av最新在线| 91精品国产综合久久香蕉的用户体验| 一区国产精品视频| 最新国产精品拍自在线播放| 日韩在线观看免费网站| 国产午夜精品全部视频播放| 日韩欧美有码在线| 中日韩美女免费视频网站在线观看| 国产精品久久久久久久久久久久久| 这里只有精品在线播放| 中文字幕欧美日韩va免费视频| 一区二区三区国产在线观看| 国产69久久精品成人看| 久久精品这里热有精品| 2018中文字幕一区二区三区| 日韩av手机在线看| 亚洲精品国精品久久99热一| 日本19禁啪啪免费观看www| 久久久久日韩精品久久久男男| 欧美激情精品久久久久久久变态| 国产成人精品久久亚洲高清不卡| 精品亚洲va在线va天堂资源站| 久久成人免费视频| 91在线观看免费| 欧美激情xxxx性bbbb| 亚洲精品视频在线播放| 日韩av网站电影| 日韩av在线直播| 色综合天天狠天天透天天伊人| 亚洲成人网在线观看| 国产精品欧美日韩| 成人欧美在线视频| 欧美乱妇高清无乱码| 国产欧美一区二区白浆黑人| 成人久久18免费网站图片| 日韩精品中文字幕在线| 91chinesevideo永久地址| 欧美视频国产精品| 欧美高跟鞋交xxxxxhd| 欧美激情亚洲另类| 亚洲大胆人体av| 欧美精品国产精品日韩精品| 日本精品久久电影| 不卡av电影在线观看| 中文字幕精品久久久久| 大伊人狠狠躁夜夜躁av一区| 亚洲成色777777女色窝| 国产成人综合久久| 热久久视久久精品18亚洲精品| 91精品国产99久久久久久| 亚洲图片制服诱惑| 播播国产欧美激情| 97久久精品人搡人人玩| www欧美xxxx| 欧美日韩免费在线观看| 成人福利网站在线观看| 91在线精品视频| 久久亚洲一区二区三区四区五区高| 欧美黄色片在线观看| 中文字幕一区电影| 亚洲人午夜精品免费| 亚洲毛片在线看| 国产精品视频自拍| 日韩精品视频在线播放| 成人免费看吃奶视频网站| 欧美成人激情视频| 国产视频999| 日韩电视剧免费观看网站| 欧美高清第一页| 久久男人av资源网站| 国产成人高清激情视频在线观看| 国产精品高潮呻吟久久av无限| 日韩精品免费在线视频| 亚洲午夜精品视频| 一本一本久久a久久精品综合小说| 成人国产精品久久久| 欧洲午夜精品久久久| 国产在线观看精品一区二区三区| 欧美日韩一区二区在线播放| 日韩成人激情在线| 国产成人在线一区二区| 国产成人精品国内自产拍免费看| 亚洲三级免费看| 亚洲xxxx视频| 亚洲欧洲美洲在线综合| 一本色道久久88综合日韩精品| 日韩有码视频在线| 日本亚洲精品在线观看| 国产视频在线观看一区二区| 97在线观看视频国产| 久久免费少妇高潮久久精品99| 亚洲午夜av久久乱码| 日韩视频欧美视频| 亚洲**2019国产| 一本色道久久88精品综合| 国语对白做受69| 亚洲精品av在线播放| 亚洲人成欧美中文字幕| 亚洲欧美在线看| 一区二区三区四区视频| 亚洲深夜福利在线| 欧美亚洲国产另类| 国产成人久久久精品一区| 欧美激情一区二区久久久| 日韩免费在线视频| 国产精品自拍偷拍视频| 欧美日韩亚洲精品一区二区三区| 国产成人拍精品视频午夜网站| 岛国av在线不卡| 日韩av影视综合网| 国产精品日本精品| 亚洲综合视频1区| 全球成人中文在线| 久久精品电影一区二区| 国产精品一区二区久久久久| 国内偷自视频区视频综合| 国产精品永久免费在线| 91黄色8090| 这里只有精品视频| 亚洲最大av网站| 日韩精品免费一线在线观看| 96精品久久久久中文字幕| 欧美日韩国产精品专区| 成人精品一区二区三区电影黑人| 国产视频精品在线| 国产成人+综合亚洲+天堂| 欧美日韩亚洲精品内裤| 91久久在线视频| 久久国产精品久久久久久久久久| 九九热这里只有精品免费看| 成人av电影天堂| 91啪国产在线| 欧美日韩亚洲视频| 欧美在线视频免费播放| 国产精品xxxxx| 亚洲欧美日韩天堂一区二区| 亚洲精品videossex少妇| 欧美三级免费观看| 欧美在线视频一二三| 日韩欧美在线字幕| 欧美性猛交xxx| 国内精品久久久久久影视8| 日韩av中文字幕在线播放|