Time of Update: 2017-02-27
#include <iostream>#include <string>using namespace std;void main(int argc,char* argv[]){ int a=10; int b=20; int &rn=a; cout<<rn<<"|"<<a<<endl; cout<<&rn<<"|"
Time of Update: 2017-02-27
主從複合結構(Master/Detail)是基於"一對多"的關係,在一個資料庫表中提供詳細的資訊,而這個表是通過另一個資料庫表的外來關鍵字訪問相關記錄的。基於主從複合結構,我們可以在瀏覽一個表中的資料時,同時給出另一個表中與這個記錄相關的所有記錄資訊。Borland C++Builder提供了TTable
Time of Update: 2017-02-27
在解決我們的書店問題之前,我們需要理解的唯一的剩餘問題是如何編寫一個資料結構(data structure)來表示我們的交易資料。在C++中我們通過定義類(class)來定義自己的資料結構。類機制是C++中最重要的特性之一。實際上,C++設計的主要聚焦點是使我們能夠定義類類型(class types),使它的操作與內建類型一樣自然。我們已經看到了類庫類型(例如istream和ostream),它們都是作為類定義的--也就是說,嚴格地說,它們並不是語言的一部分。完整地理解類機制需要掌握大量的資訊。
Time of Update: 2017-02-27
測試程式後面的常式,都是對數組的排序,使用靜態鏈表的也適用於鏈表的排序。為簡單起見,只對單關鍵碼排序,並且最後的結果都是從頭到尾按升序排列。下面是統一的測試程式:#include <iostream>#include <iomanip>using namespace std;#include <stdlib.h>#include <time.h>#include <math.h>#include
Time of Update: 2017-02-27
使用了一段時間的 Visual Studio 2005 之後,發現它的 C++ 編譯器比以往更多地遵循 C++ 標準。給我印象比較深的文法變化有兩個:1、for 迴圈語句中迴圈控制變數的有效範圍更加明確以前我們在for語句中可以這麼寫:for (int i=0; i<max; i++) {// do something}if (i>0) {// do something else}這段代碼中 i 是迴圈控制變數,迴圈處理完之後,在迴圈語句之外,i
Time of Update: 2017-02-27
引言C/C++語言的記憶體管理經曆了幾次變革,但至今仍未能趨於成熟。這幾次變革主要包括:1. 從malloc/free到new/delete。這場變革是OOP技術興起的產物。C++是強型別語言,new/delete的主要成果也就是加強了類型觀念,減少了強制類型轉換的需求。但是從記憶體管理角度看,這個變革並沒有多少的突破性。2.
Time of Update: 2017-02-27
大多數程式員認為如果他們能這樣寫代碼:x = x + y; x = x - y;那他們也能這樣寫:x += y; x -= y;如果x和y是使用者定義的類型(user-defined type),就不能確保這樣。就C++來說,operator+、operator=和operator+=之間沒有任何關係,因此如果你想讓這三個operator同時存在並具有你所期望的關係,就必須自己實現它們。同理,operator -, *, /, 等等也一樣。確保operator的賦值形式(assignment
Time of Update: 2017-02-27
預設建構函式(指沒有參數的建構函式)在C++語言中是一種讓你無中生有的方法。建構函式能初始化對象,而預設建構函式則可以不利用任何在建立對象時的外部資料就能初始化對象。有時這樣的方法是不錯的。例如一些行為特性與數字相仿的對象被初始化為空白值或不確定的值也是合理的,還有比如鏈表、雜湊表、圖等等資料結構也可以被初始化為空白容器。但不是所有的對象都屬於上述類型,對於很多個物件來說,不利用外部資料進行完全的初始化是不合理的。比如一個沒有輸入姓名的地址簿對象,就沒有任何意義。在一些公司裡,所有的裝置都必須標
Time of Update: 2017-02-27
每個C++程式都包含一個或多個函數(function),其中的一個函數的名稱必須是main。一個函數由一系列執行函數功能的語句(statement)組成。作業系統通過調用main函數來執行程式。這個函數執行它的組成語句並給作業系統返回一個值。下面是一個簡單的main函數,它沒有傳回值:int main(){return
Time of Update: 2017-02-27
為了在運行時處理異常,程式要記錄大量的資訊。無論執行到什麼地方,程式都必須能夠識別出如果在此處拋出異常的話,將要被釋放哪一個對象;程式必須知道每一個進入點,以便從try塊中退出;對於每一個try塊,他們都必須跟蹤與其相關的catch子句以及這些catch子句能夠捕獲的異常類型。這種資訊的記錄不是沒有代價的。確保程式滿足異常規格不需要運行時的比較(runtime
Time of Update: 2017-02-27
在我們的程式變得更複雜之前,我們先看看C++是如何處理注釋的。注釋可以協助人們閱讀程式。在典型情況下,它們用於總結演算法、表明變數的目的或澄清其它一些模糊的程式碼片段。注釋不會增加可執行程式的大小。編譯器會忽略所有注釋。在C++中有兩種類型的注釋:單行注釋和成對注釋。單行注釋以雙斜線(//)開頭。同一行中斜線右側的所有內容都是注釋,會被編譯器略過。另一個分隔字元是注釋符號對(/*
Time of Update: 2017-02-27
1.
Time of Update: 2017-02-27
1.常用的C++單元測試架構測試驅動開發(TDD)已經是一種非常流行的開發方式了,在Java和.Net中都提供了非常好的單元測試架構,最近研究C++下面的單元測試,發現其實在C++中還是有很多選擇:CPPUnit:著名的XUnit系列產品之一,熟悉JUnit、NUnit的開發人員可以很快上手。CXXTest:需要進行預先處理,需要安裝Perl或Python。Boost Test:功能強大,提供了自動註冊和手動註冊兩種方式,更重要的是來自千錘百鍊的Boost庫。Google
Time of Update: 2017-02-27
語句是按次序執行的:同一個函數中第一個語句首先執行,接著執行第二個……當然,少數的程式--包括我們需要編寫的解決書店問題的程式--可以只使用一個次序執行。作為代替,程式設計語言提供了多種控制結構,允許更加複雜的執行路徑。這一部分將簡單地介紹C++提供的一些控制結構。練習7:編譯一個包含錯誤的嵌套注釋的程式。練習8:指出下面哪些輸出語句是合法的:std::cout << "/*";std::cout <<
Time of Update: 2017-02-27
這次我們看看菱形結構的虛繼承。虛繼承的引入本就是為瞭解決複雜結構的繼承體系問題。上一篇我們在討論虛繼承時用的是一個簡單的繼承結構,只是為了打個鋪墊。我們先看看這幾個類,這是一個典型的菱形繼承結構。C100和C101通過虛繼承共用同一個父類C041。C110則從C100和C101多重繼承而來。struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C100 : public
Time of Update: 2017-02-27
IBM ®Rational®Systems Developer 的 C++ 可視化(C++ Visualization)特效能夠讓您使用 C++ 代碼,利用一個類似 UML 的符號提供與 UML 建模相似的技巧。這篇文章展示了如何圖形化地表示(顯示) C++ 原理,發現並顯示它們在 UML 圖中的關係,建立新的 C++ 組件,直接從圖中編輯原始碼,建立關聯和導航特性。C++ 可視化特性的介紹IBM®Rational®Systems Developer C++
Time of Update: 2017-02-27
問題:在下面的 template declarations(模板聲明)中 class 和 typename 有什麼不同?template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses "typename"答案:沒什麼不同。在聲明一個 template type parameter(模板型別參數)的時候,class 和
Time of Update: 2017-02-27
前面已經說過程式就是方法的描述,而方法的描述無外乎就是動作加動作的賓語,而這裡的動作在C++中就是通過語句來表現的,而動作的賓語,也就是能夠被操作的資源,但非常可惜地C++語言本身只支援一種資源——記憶體。由於電腦實際可以操作不止記憶體這一種資源,導致C++語言實際並不能作為底層硬體程式的編寫語言(即使是C語言也不能),不過各編譯器廠商都提供了自己的嵌入式彙編語句功能(也可能沒提供或提供其它的附加文法以使得可以操作硬體),對於VC,通過使用__asm語句即可實現在C++代
Time of Update: 2017-02-27
如果類中存在虛函數時,情況會怎樣呢?我們知道當一個類中有虛函數時,編譯器會為該類產生一個虛函數表,並在它的每一個對象中插入一個指向該虛函數表的指標,通常這個指標是插在對象的起始位置。所謂的虛函數表實際就是一個指標數組,其中的指標指向真正的函數起始地址。我們來驗證一下,定義一個無成員變數的類C040,內含一個虛函數。struct C040{ virtual void foo() {}};運行如下代碼列印它的大小及對象中的內容。PRINT_SIZE_DETAIL(C040)結果為:The size
Time of Update: 2017-02-27
在上一篇中我著重介紹了WINDOWS