Time of Update: 2017-02-27
當一個函數是內聯和虛函數時,會發生代碼替換或使用虛表調用嗎? 為了弄 清楚內聯和虛函數,讓我們將它們分開來考慮。通常,一個內嵌函式是被展開的 。class CFoo { private: int val; public: int GetVal() { return val; } int SetVal(int v) { return val=v; } };這裡,如果使用下列代碼:CFoo x;x.SetVal(17);int y =
Time of Update: 2017-02-27
經曆過從c到c++的人,一定想知道c++編譯器是如何安排類的成員的.這裡我大概的作一下介紹,並有一些代碼供你進行測試,希望對大家有點作用吧.其實這裡的標題或許有點大了,簡單的說,類的非static成員是按照聲明的順序存放在記憶體區的,而類的static成員和一般的static變數的儲存格式一樣.我不從簡單的東西入手了,直接從一個相對複雜的多重繼承的例子入手.看下面的代碼:class Point2d{public:int _x,_y;virtual f(){}//保證Point2d有個虛擬指標};
Time of Update: 2017-02-27
1.簡介異常是由語言提供的運行時刻錯誤處理的一種方式。提到錯誤 處理,即使不提到異常,你大概也已經有了豐富的經驗,但是為了可以清楚的看 到異常的好處,我們還是不妨來回顧一下常用的以及不常用的錯誤處理方式。1.1 常用的錯誤處理方式傳回值。我們常用函數的傳回值來標誌成功或 者失敗,甚至是失敗的原因。但是這種做法最大的問題是如果調用者不主動檢查 傳回值也是可以被編譯器接受的,你也奈何不了他:) 這在C++中還導致另外一個 問題,就是重載函數不能只有不同的傳回值,而有相同的參數表,因為如果調用
Time of Update: 2017-02-27
動態串連庫的建立步驟:一、建立Non-MFC DLL動態連結程式庫1、開啟File —> New —> Project選項,選擇Win32 Dynamic-Link Library —>sample project—>工程名:DllDemo2、建立一個.h檔案DllDemo.h#ifdef DllDemo_EXPORTS#define DllAPI __declspec(dllexport)#else#define
Time of Update: 2017-02-27
C++Builder擁有卓越的資料庫網路開發功能,可以存取各種關係型資料庫,提供高效的資料感知組件和資料存取組件,它不僅可為C/S結構提供用戶端程式,而且可開發應用伺服器程式,實現多層資料庫應用程式體繫結構,是VFP資料庫進行網路開發的最佳選擇。VFP資料庫系統有兩種方式建立資料表,一種是建立與FoxPro相容的自由表,另一種是建立資料庫,資料庫中包含資料表及關係,因此在C++
Time of Update: 2017-02-27
一個月下來,把常見的20個設計模式好好複習並且逐個用C++實現了一遍,收穫還是很大的,很多東西看上去明白了但是真正動手去做的時候發現其實還是不明白--我深知這個道理,於是不敢怠慢,不敢寫什麼所謂的解釋原理的虛擬碼,不敢說所謂的"知道原理就可以了"....因為我知道,我還還沒有資格說這個話,至少對於設計模式而言我還是一個初學者,唯有踏實和實幹才能慢慢的掌握到知識.在我學習設計模式的過程中,覺得造成理解困難的主要是以下幾點,談一下自己的體會,希望對他人有協助,不要走上我的老路上,
Time of Update: 2017-02-27
作用:表示一個作用於某對象結構中的各元素的操作.它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作.UML結構圖:解析:Visitor模式把對結點的訪問封裝成一個抽象基類,通過派生出不同的類產生新的訪問方式.在實現的時候,在visitor抽象基類中聲明了對所有不同結點進行訪問的介面函數,如圖中的VisitConcreateElementA函數等,這樣也造成了Visitor模式的一個缺陷--新加入一個結點的時候都要添加Visitor中的對其進行提供者函數,這樣使得所有的Visitor及
Time of Update: 2017-02-27
作用:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態.這樣以後就可將該對象恢複到原先儲存的狀態.UML結構圖:解析:Memento模式中封裝的是需要儲存的狀態,當需要恢複的時候才取出來進行恢複.原理很簡單,實現的時候需要注意一個地方:窄介面和寬介面.所謂的寬介面就是一般意義上的介面,把對外的介面作為public成員;而窄介面反之,把介面作為private成員,而把需要訪問這些介面函數的類作為這個類的友元類,也就是說介面只暴露給了對這些介面感興趣的類,而不是暴露在外部.
Time of Update: 2017-02-27
作用:提供一種方法順序訪問一個彙總對象中各個元素,,而又不需暴露該對象的內部表示.UML結構圖:解析:Iterator幾乎是大部分人在初學C++的時候就無意之中接觸到的第一種設計模式,因為在STL之中,所有的容器類都有與之相關的迭代器.以前初學STL的時候,時常在看到講述迭代器作用的時候是這麼說的:提供一種方式,使得演算法和容器可以獨立的變化,而且在訪問容器物件的時候不必暴露容器的內部細節,具體是怎麼做到這一點的呢?在STL的實現中,所有的迭代器(Iterator)都必須遵照一套規範,這套規範裡
Time of Update: 2017-02-27
作用:允許一個對象在其內部狀態改變時改變它的行為.UML結構圖:解析:State模式主要解決的是在開發中時常遇到的根據不同的狀態需要進行不同的處理操作的問題,而這樣的問題,大部分人是採用switch-case語句進行處理的,這樣會造成一個問題:分支過多,而且如果加入一個新的狀態就需要對原來的代碼進行編譯.State模式採用了對這些不同的狀態進行封裝的方式處理這類問題,當狀態改變的時候進行處理然後再切換到另一種狀態,也就是說把狀態的切換責任交給了具體的狀態類去負責.同時,State模式和Strat
Time of Update: 2017-02-27
作用:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換.本模式使得演算法可獨立於使用它的客戶而變化.解析:簡而言之一句話,Strategy模式是對演算法的封裝.處理一個問題的時候可能有多種演算法,這些演算法的介面(輸入參數,輸出參數等)都是一致的,那麼可以考慮採用Strategy模式對這些演算法進行封裝,在基類中定義一個函數介面就可以了.實現:1)Strategy.h/**//****************************************************
Time of Update: 2017-02-27
作用:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新.UML結構圖:解析:Observer模式定義的是一種一對多的關係,這裡的一就是圖中的Subject類,而多則是Obesrver類,當Subject類的狀態發生變化的時候通知與之對應的Obesrver類們也去相應的更新狀態,同時支援動態添加和刪除Observer對象的功能.Obesrver模式的實現要點是,第一一般subject類都是採用鏈表等容器來存放Observer對象,第二抽取出Ob
Time of Update: 2017-02-27
作用:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可撤消的操作.UML結構圖:解析:Comnand模式的思想是把命令封裝在一個類中,就是這裡的Command基類,同時把接收對象也封裝在一個類中就是這裡的Receiver類中,由調用這個命令的類也就是這裡的Invoker類來調用.其實,如果弄清楚了Command模式的原理,就會發現其實它和註冊回呼函數的原理是很相似的,而在面向過程的設計中的回呼函數其實和這裡的Command類的作用是一致的.採
Time of Update: 2017-02-27
筆試時曾經遇到過的一道題,當時沒有好的想法。今天無意中想起,於是把自己的一種解決方案記下來。1. main.cpp1./**2. * 問題描述:3. * 刪除數組內重複的資料4. *5. * 一個解決方案:6. * 可以先將數組排序,然後再刪除7. * 如一個已經排好序的整數數組:1, 1, 2, 2, 38. */9.10.#include <iostream>11.12.using std::cout;13.using std::endl;14.using std::swap;1
Time of Update: 2017-02-27
在本教程中,我假設大家都知道如何使用C++的類進行工作,因為我所有的資料結構,要立足於他們。我遇到過關於資料結構的教程,但是很難找到一個使用OOP來編寫的。因此,這其中將主要集中於用一個類來編寫資料結構。棧在編寫代碼時,堆棧是最常用的資料結構。它的概念簡單,編寫也比較簡單。有這麼一個情況,桌子上有堆成一堆的5本書,你想增加一本。應該怎麼做?只要把書放在頂端就可以了。如果你想從這堆書中取出第3本呢?你只要一本接著一本把書移到頂端,直到第3本書處在頂端。然後取走第3本書,並使其他處在頂端。你已經注意
Time of Update: 2017-02-27
眾所周知,boost裡面有一個Serialization。不過我這個跟boost的有本質上的差別。boost的Serialization是通過重載操作符將一個對象與一個流進行讀寫,而我則通過記錄類的成員變數來自動產生相應的讀寫動作。不過我的Serialization庫有兩個缺點,就是效率不是特別高,因為我產生的是可以與XML進行互相轉換的通用對象。雖然這並不是必需的,只是我的個人愛好罷了。第二個缺點是Serialization會產生侵入式的代碼。使用方法如下:首先改造需要被Serialize的類
Time of Update: 2017-02-27
列印下面的圖案:菱形列印#include<iostream>using namespace std;int main(){ int n=5; //產生菱形上部分的星號,前N行 for(int i=1; i<=n; i++) { for(int j=1; j<=n-i; j++) cout<<" "; for(int k=1; k<=2*i-1; k++) cout<<"*&
Time of Update: 2017-02-27
在我們討論多態的時候,先看看什麼是寫入程式碼和軟編碼:寫入程式碼就是把代碼寫死了,導致彈性不足,降低了可擴充性,例如在代碼裡的if……else……;switch……case……這些代碼通常都屬於寫入程式碼,項目中的這些代碼多了,就相當於說明這個代碼的靈活性、擴充性、彈性等等的少了。所以,我們要盡量使用軟編碼,通俗點就是“別把話說死了,留點轉彎的餘地”。多態性就是
Time of Update: 2017-02-27
一、環境準備在本文中,所有程式均在Linux下開發完成,經測試能夠正常運行。在開發過程中,我們需要用到gSOAP,可以從以下網址下載獲得: http://www.cs.fsu.edu/~engelen/soap.html我下載的是gsoap_2.7.12.tar.gz下載下來解壓縮,按正常安裝過程進行編譯、安裝。# tar zxvf gsozp_2.7.12.tar.gz# cd gsoap_2.7.12# ./configure –-prefix=/usr/local/gSOAP(
Time of Update: 2017-02-27
教程需求在繼續前,請確保您重新檢查了本節的需求。先決條件本 教程假設您已經有一些使用 IDE 的基本知識和 Java 編程經驗。本教程所需的軟 件在開始前,您需要安裝 NetBeans 6.0。您將同時需要 C/C++ 和 Java SE 支援,所 以最佳選擇是選擇“下載全部”選項並在安裝時排除 Base IDE、Java SE 和 C/C++ 包之外的所有模組。準備項目對本教程,我們需要兩個項目。一個是管 理我們的外掛程式的原始碼的 NetBeans