• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                 摘要: 介紹LuaPlus: 好用的Lua For C++擴(kuò)展(修訂)LuaPlus是Lua的C++增強(qiáng),也就是說(shuō),LuaPlus本身就是在Lua的源碼上進(jìn)行增強(qiáng)得來(lái)的。用它與C++進(jìn)行合作,是比較好的一個(gè)選擇。LuaPlus目前版本為:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大家可以到http://luaplus....  閱讀全文

            posted @ 2011-08-03 07:42 RTY 閱讀(450) | 評(píng)論 (0)編輯 收藏

            Stable release

            The latest stable release of PyInstaller is 1.5.1 (Change Log). See below for download links.

            Features

            • Packaging of Python programs into standard executables, that work on computers without Python installed.
            • Multiplatform: works under Windows (32-bit and 64-bit), Linux (32-bit and 64-bit) and Mac OS X (32-bit only, 64-bit in svn, see MacOsCompatibility).
            • Multiversion: works under any version of Python from 2.2 up to 2.7.
            • Flexible packaging mode:
              • Single directory: build a directory containing an executable plus all the external binary modules (.dll, .pyd, .so) used by the program.
              • Single file: build a single executable file, totally self-contained, which runs without any external dependency.
              • Custom: you can automate PyInstaller to do whatever packaging mode you want through a simple script file in Python.
            • Explicit intelligent support for many 3rd-packages (for hidden imports, external data files, etc.), to make them work with PyInstaller out-of-the-box (see SupportedPackages).
            • Full single-file EGG support: required .egg files are automatically inspected for dependencies and bundled, and all the egg-specific features are supported at runtime as well (entry points, etc.).
            • Partial directory EGG support: required .egg directories are automatically inspected for dependencies and bundled, but egg-specific features will not work at runtime.
            • Automatic support for binary libraries used through ctypes (see CtypesDependencySupport for details).
            • Support for automatic binary packing through the well-known  UPX compressor.
            • Optional console mode (see standard output and standard error at runtime).
            • Windows-specific features:
              • Support for code-signing executables.
              • Full automatic support for CRTs: no need to manually distribute MSVCR*.DLL, redist installers, manifests, or anything else; true one-file applications that work everywhere! (seePython26Win)
              • Selectable executable icon.
              • Fully configurable version resource section and manifests in executable.
              • Support for building COM servers.
            • Mac-specific features:

            License

            PyInstaller is distributed under the GPL license (see the file doc/LICENSE.GPL in the source code), with a special exception which allows to use PyInstaller to build and distribute non-free programs (including commercial ones). In other words, you have no restrictions in using PyInstaller as-is, but any kind of modifications to it will have to comply with the GPL license. See also our FAQ.

            posted @ 2011-08-02 07:28 RTY 閱讀(523) | 評(píng)論 (0)編輯 收藏

            在 C++ 中使用 Python script

            想要在c++ 中嵌入script 代碼, 除了自己寫腳本引擎外, lua, python 都可以在c++ 中使用, 另外MonoBind, AngelScript library 都是一些c++ script library, 可以嵌入到c++ 中使用 . 
            今天在c++ 中試著嵌入 python 代碼 (示例代碼在 Python-2.5.2\Demo\embed\ 下)

            #include <Python.h>
            int main(int argc, char *argv[])
            {
              
            // Py_NoSiteFlag = 1;
              
            // Py_SetPythonHome("D:\\usr\\Python"); // PYTHONHOME

              Py_Initialize();
              PyRun_SimpleString(
            "from time import time,ctime\n"
                                 
            "print 'Today is',ctime(time())\n");
              Py_Finalize();
              
            return 0;
            }

            在運(yùn)行時(shí)可能會(huì)產(chǎn)生類似 'import site' failed; use -v for traceback 的錯(cuò)誤, 原因是python 在import module 的時(shí)候的路徑問(wèn)題. 有3種方法可以解決(以前通過(guò)設(shè)置環(huán)境變量 PYTHONPATH 好像在2.5 已經(jīng)無(wú)效了). 
            0. 取消注釋 Py_NoSiteFlag = 1; 
            這個(gè)只是取消import site , 當(dāng)然如果在代碼中要import 啥的話, 還是會(huì)出現(xiàn)錯(cuò)誤的. 
            a. 設(shè)置環(huán)境變量 PYTHONHOME = D:\usr\Python  
            b. 在調(diào)用 Py_Initialize 之前調(diào)用函數(shù) 
            Py_SetPythonHome("D:\\usr\\Python");  // 參數(shù)是python 的安裝目錄 

            2. 其他一些有用的資源 
            Python/C API Reference Manual (API 參考) ,  Extending and Embedding the Python Interpreter (擴(kuò)展及嵌入Python解釋器, 主要說(shuō)明了如何擴(kuò)展Python, 給Python 寫擴(kuò)展, 其中 5. Embedding Python in Another Application  一章講述了在C++中嵌入/調(diào)用Python 代碼 ) 

            使用C/C++擴(kuò)展Python  對(duì)文 Extending and Embedding the Python Interpreter 作了精簡(jiǎn), 很不錯(cuò)的一篇文章, 但是跳過(guò)了一些基礎(chǔ) . 

            Building Hybrid Systems with Boost.Python 介紹了使用boost.python 方便python 插件開發(fā),python綁定c++程序 是其中文版本. 

            Embedding Python in Multi-Threaded C/C++ Applications 講了c++在多線程環(huán)境如何使用Python , 文 C++多線程中調(diào)用python api函數(shù) 提供了一個(gè)多線程的封裝. 

            SCXX - A Simple Python/C++ API
            http://davidf.sjsoft.com/mirrors/mcmillan-inc/scxx.html

            C++擴(kuò)展和嵌入Python應(yīng)用 (介紹了一些Python/C API 函數(shù), 以及ext 例子, 一般般) 
            http://hi.baidu.com/yunsweet/blog/item/20b08aeebaa2b1282cf534c7.html


            3. Python 多線程的使用 

            zz http://blog.csdn.net/liguangyi/archive/2007/06/20/1659697.aspx 
            今天看了近一天關(guān)于多線程的應(yīng)用中,如何安全調(diào)用python方面的資料,開始的時(shí)候看的簡(jiǎn)直頭大如斗,被python語(yǔ)言的全局鎖(Global Interpreter Lock)、線程狀態(tài)(Thread State )等都有點(diǎn)繞暈了,后來(lái)經(jīng)過(guò)各方面文章和幫助文檔的相互參考,發(fā)現(xiàn)對(duì)于2.4/2.5版本,提供了PyGILState_Ensure, PyGILState_Release,哎,這下可方便大發(fā)了。

            一、首先定義一個(gè)封裝類,主要是保證PyGILState_Ensure, PyGILState_Release配對(duì)使用,而且這個(gè)類是可以嵌套使用的。

            #include <python.h>

            class PyThreadStateLock
            {
            public:
                PyThreadStateLock(void)
                {
                    state = PyGILState_Ensure( );
                }

                ~PyThreadStateLock(void)
                {
                     PyGILState_Release( state );
                }
            private:
                PyGILState_STATE state;
            };


            二、在主線程中,這樣處理

                // 初始化
                Py_Initialize();
                // 初始化線程支持
                PyEval_InitThreads();
                // 啟動(dòng)子線程前執(zhí)行,為了釋放PyEval_InitThreads獲得的全局鎖,否則子線程可能無(wú)法獲取到全局鎖。
                PyEval_ReleaseThread(PyThreadState_Get());
               
                // 其他的處理,如啟動(dòng)子線程等
                ......
                   
                // 保證子線程調(diào)用都結(jié)束后
                PyGILState_Ensure();
                Py_Finalize();
                // 之后不能再調(diào)用任何python的API

            三、在主線程,或者子線程中,調(diào)用python本身函數(shù)的都采用如下處理

                {
                    class PyThreadStateLock PyThreadLock;
                    // 調(diào)用python的API函數(shù)處理
                    ......
                }

            呵呵,看這樣是否非常簡(jiǎn)單了。


            另外還有兩個(gè)和全局鎖有關(guān)的宏,Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS。這兩個(gè)宏是為了在較長(zhǎng)時(shí)間的C函數(shù)調(diào)用前,臨時(shí)釋放全局鎖,完成后重新獲取全局鎖,以避免阻塞其他python的線程繼續(xù)運(yùn)行。這兩個(gè)宏可以這樣調(diào)用

                {
                    class PyThreadStateLock PyThreadLock;
                    // 調(diào)用python的API函數(shù)處理
                    ......

                    Py_BEGIN_ALLOW_THREADS
                    // 調(diào)用需要長(zhǎng)時(shí)間的C函數(shù)
                    ......
                    Py_END_ALLOW_THREADS

                    // 調(diào)用python的API函數(shù)處理
                    ......
                }

            4. 可能的錯(cuò)誤及解決 
            a. 在vs 200x 下 debug 模式出現(xiàn)鏈接問(wèn)題 
            extmodule.obj : error LNK2019: unresolved external symbol __imp___Py_Dealloc referenced in function _PySwigObject_format
            extmodule.obj : error LNK2019: unresolved external symbol __imp___Py_NegativeRefcount referenced in function _PySwigObject_format
            extmodule.obj : error LNK2001: unresolved external symbol __imp___Py_RefTotal
            extmodule.obj : error LNK2019: unresolved external symbol __imp___PyObject_DebugFree referenced in function _PySwigObject_dealloc
            extmodule.obj : error LNK2019: unresolved external symbol __imp___PyObject_DebugMalloc referenced in function _PySwigObject_New
            extmodule.obj : error LNK2019: unresolved external symbol __imp__Py_InitModule4TraceRefs referenced in function _init_extmodule

            主要是因?yàn)?Py_DEBUG/Py_TRACE_REFS 引起, 修改 Python\include 下的 pyconfig.h, object.h 兩個(gè)文件就行了 ... 詳見 http://www.nabble.com/link-error-in-debug-mode-td3126668.html 

            posted on 2008-08-14 17:55 泡泡牛 閱讀(4472) 評(píng)論(3)  編輯 收藏 引用 所屬分類: Python

            評(píng)論

            # re: 在 C++ 中使用 Python script  2008-08-15 20:34 泡泡牛 

            誰(shuí)知道有什么其他的可以在c++ 里面調(diào)用的script 引擎嗎?

            # re: 在 C++ 中使用 Python script  2008-09-24 20:10 sheena 

            主要是因?yàn)?Py_DEBUG/Py_TRACE_REFS 引起, 修改 Python\include 下的 pyconfig.h, object.h 兩個(gè)文件就行了 ... 詳見 http://www.nabble.com/link-error-in-debug-mode-td3126668.html 
            這個(gè)解釋我還是沒(méi)有看明白,?您能再解釋下嗎

            # re: 在 C++ 中使用 Python script  2008-09-24 22:17 泡泡牛 

            1. 修改 pyconfig.h 

            修改 

            #ifdef _DEBUG 
            # define Py_DEBUG 
            #endif 

            為 

            #ifdef _DEBUG 
            //# define Py_DEBUG 
            #endif 

            修改 

            # ifdef _DEBUG 
            # pragma comment(lib,"python24_d.lib") 
            # else 
            # pragma comment(lib,"python24.lib") 
            # endif /* _DEBUG */ 

            為 

            # ifdef _DEBUG 
            # pragma comment(lib,"python24.lib") 
            # else 
            # pragma comment(lib,"python24.lib") 
            # endif /* _DEBUG */ 


            2. object.h 
            修改 
            #if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) 
            #define Py_TRACE_REFS 
            #endif 

            為 

            #if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) 
            // #define Py_TRACE_REFS 
            #endif

            posted @ 2011-07-28 07:24 RTY 閱讀(799) | 評(píng)論 (0)編輯 收藏

            Bitdefender 全方位安全殺毒軟件激活碼(序列號(hào))/Bitdefender Internet Security正版激活碼
             說(shuō)明:以下激活碼(序列號(hào))適用Bitdefender Internet Security 2011
            BitDefender Internet Security 2011正版激活碼一年期,可激活最新版本2011
            激活碼 67PIDQD

            BitDefender Internet Security 2011激活碼一枚【LA0G】(365天)
            激活碼 NGELA0G


            BitDefender Internet Security 2011激活碼一枚【5X3Q】(180天)
            激活碼 SQA5X3Q


            BitDefender Internet Security 2011激活碼一枚【14A2】(283天)
            14A20BF746E7C46DC941


            BitDefender Internet Security 2011最新激活碼(180天)

            激活碼
            5LLHJ7I         356天
            AIFRUVN         173天
            N7T5033         173天
            5UZXTCE         175天
            XLWWGV0         1051天


            BitDefender Internet Security 2011激活碼【NDS0】(152天)
            激活碼 QVUNDS0


            BitDefender Internet Security 2011可疊加180天激活碼兩枚
            激活碼: LTHGXPX
            激活碼: LFWHQ4Y


            BitDefender Internet Security 2011最新激活碼(180天)兩枚
            激活碼: 4J24PJJ
            激活碼: YVKAS47

            posted @ 2011-07-26 22:24 RTY 閱讀(766) | 評(píng)論 (0)編輯 收藏

            看到const 關(guān)鍵字,C++程序員首先想到的可能是const 常量。這可不是良好的條件反射。如果只知道用const 定義常量,那么相當(dāng)于把火藥僅用于制作鞭炮。const 更大的魅力是它可以修飾函數(shù)的參數(shù)、返回值,甚至函數(shù)的定義體。

            const 是constant 的縮寫,“恒定不變”的意思。被const 修飾的東西都受到強(qiáng)制保護(hù),可以預(yù)防意外的變動(dòng),能提高程序的健壯性。所以很多C++程序設(shè)計(jì)書籍建議:“Use const whenever you need”。

            1.用const 修飾函數(shù)的參數(shù)

            如果參數(shù)作輸出用,不論它是什么數(shù)據(jù)類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加const 修飾,否則該參數(shù)將失去輸出功能。const 只能修飾輸入?yún)?shù):

            如果輸入?yún)?shù)采用“指針傳遞”,那么加const 修飾可以防止意外地改動(dòng)該指針,起到保護(hù)作用。

            例如StringCopy 函數(shù):

            void StringCopy(char *strDestination, const char *strSource);

            其中strSource 是輸入?yún)?shù),strDestination 是輸出參數(shù)。給strSource 加上const修飾后,如果函數(shù)體內(nèi)的語(yǔ)句試圖改動(dòng)strSource 的內(nèi)容,編譯器將指出錯(cuò)誤。

            如果輸入?yún)?shù)采用“值傳遞”,由于函數(shù)將自動(dòng)產(chǎn)生臨時(shí)變量用于復(fù)制該參數(shù),該輸入?yún)?shù)本來(lái)就無(wú)需保護(hù),所以不要加const 修飾。

            例如不要將函數(shù)void Func1(int x) 寫成void Func1(const int x)。同理不要將函數(shù)void Func2(A a) 寫成void Func2(const A a)。其中A 為用戶自定義的數(shù)據(jù)類型。

            對(duì)于非內(nèi)部數(shù)據(jù)類型的參數(shù)而言,象void Func(A a) 這樣聲明的函數(shù)注定效率比較底。因?yàn)楹瘮?shù)體內(nèi)將產(chǎn)生A 類型的臨時(shí)對(duì)象用于復(fù)制參數(shù)a,而臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過(guò)程都將消耗時(shí)間。

            為了提高效率,可以將函數(shù)聲明改為void Func(A &a),因?yàn)?#8220;引用傳遞”僅借用一下參數(shù)的別名而已,不需要產(chǎn)生臨時(shí)對(duì)象。但是函數(shù)void Func(A &a) 存在一個(gè)缺點(diǎn):

            “引用傳遞”有可能改變參數(shù)a,這是我們不期望的。解決這個(gè)問(wèn)題很容易,加const修飾即可,因此函數(shù)最終成為void Func(const A &a)。

            以此類推,是否應(yīng)將void Func(int x) 改寫為void Func(const int &x),以便提高效率?完全沒(méi)有必要,因?yàn)閮?nèi)部數(shù)據(jù)類型的參數(shù)不存在構(gòu)造、析構(gòu)的過(guò)程,而復(fù)制也非??欤?#8220;值傳遞”和“引用傳遞”的效率幾乎相當(dāng)。

            問(wèn)題是如此的纏綿,我只好將“const &”修飾輸入?yún)?shù)的用法總結(jié)一下。

             

            對(duì)于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

             

            對(duì)于內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達(dá)不到提高效率的目的,又降低了函數(shù)的可理解性。例如void Func(int x) 不應(yīng)該改為void Func(const int &x)。

            2 用const 修飾函數(shù)的返回值
            如果給以“指針傳遞”方式的函數(shù)返回值加const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。例如函數(shù)
            const char * GetString(void);
            如下語(yǔ)句將出現(xiàn)編譯錯(cuò)誤:
            char *str = GetString();
            正確的用法是
            const char *str = GetString();
            如果函數(shù)返回值采用“值傳遞方式”,由于函數(shù)會(huì)把返回值復(fù)制到外部臨時(shí)的存儲(chǔ)單元中,加const 修飾沒(méi)有任何價(jià)值。
            例如不要把函數(shù)int GetInt(void) 寫成const int GetInt(void)。
            同理不要把函數(shù)A GetA(void) 寫成const A GetA(void),其中A 為用戶自定義的數(shù)據(jù)類型。
            如果返回值不是內(nèi)部數(shù)據(jù)類型,將函數(shù)A GetA(void) 改寫為const A & GetA(void)的確能提高效率。但此時(shí)千萬(wàn)千萬(wàn)要小心,一定要搞清楚函數(shù)究竟是想返回一個(gè)對(duì)象的“拷貝”還是僅返回“別名”就可以了,否則程序會(huì)出錯(cuò)。
            函數(shù)返回值采用“引用傳遞”的場(chǎng)合并不多,這種方式一般只出現(xiàn)在類的賦值函數(shù)中,目的是為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)。

            例如:
            class A
            {
            A & operate = (const A &other); // 賦值函數(shù)
            };
            A a, b, c; // a, b, c 為A 的對(duì)象

            a = b = c; // 正常的鏈?zhǔn)劫x值
            (a = b) = c; // 不正常的鏈?zhǔn)劫x值,但合法
            如果將賦值函數(shù)的返回值加const 修飾,那么該返回值的內(nèi)容不允許被改動(dòng)。上例中,語(yǔ)句 a = b = c 仍然正確,但是語(yǔ)句 (a = b) = c 則是非法的。
            3 const 成員函數(shù)
            任何不會(huì)修改數(shù)據(jù)成員的函數(shù)都應(yīng)該聲明為const 類型。如果在編寫const 成員函數(shù)時(shí),不慎修改了數(shù)據(jù)成員,或者調(diào)用了其它非const 成員函數(shù),編譯器將指出錯(cuò)誤,這無(wú)疑會(huì)提高程序的健壯性。以下程序中,類stack 的成員函數(shù)GetCount 僅用于計(jì)數(shù),從邏輯上講GetCount 應(yīng)當(dāng)為const 函數(shù)。編譯器將指出GetCount 函數(shù)中的錯(cuò)誤。
            class Stack
            {
            public:
            void Push(int elem);
            int Pop(void);
            int GetCount(void) const; // const 成員函數(shù)
            private:
            int m_num;
            int m_data[100];
            };
            int Stack::GetCount(void) const
            {
            ++ m_num; // 編譯錯(cuò)誤,企圖修改數(shù)據(jù)成員m_num
            Pop(); // 編譯錯(cuò)誤,企圖調(diào)用非const 函數(shù)
            return m_num;
            }
            const 成員函數(shù)的聲明看起來(lái)怪怪的:const 關(guān)鍵字只能放在函數(shù)聲明的尾部,大概是因?yàn)槠渌胤蕉家呀?jīng)被占用了。
            關(guān)于Const函數(shù)的幾點(diǎn)規(guī)則:

            a. const對(duì)象只能訪問(wèn)const成員函數(shù),而非const對(duì)象可以訪問(wèn)任意的成員函數(shù),包括const成員函數(shù).
            b. const對(duì)象的成員是不可修改的,然而const對(duì)象通過(guò)指針維護(hù)的對(duì)象卻是可以修改的.
            c. const成員函數(shù)不可以修改對(duì)象的數(shù)據(jù),不管對(duì)象是否具有const性質(zhì).它在編譯時(shí),以是否修改成員數(shù)據(jù)為依據(jù),進(jìn)行檢查.
            e. 然而加上mutable修飾符的數(shù)據(jù)成員,對(duì)于任何情況下通過(guò)任何手段都可修改,自然此時(shí)的const成員函數(shù)是可以修改它的

            posted @ 2011-07-26 07:14 RTY 閱讀(254) | 評(píng)論 (0)編輯 收藏

            const類型定義:指明變量或?qū)ο蟮闹凳遣荒鼙桓?引入目的是為了取代預(yù)編譯指令 

            **************常量必須被初始化*************************

            cons的作用
               (1)可以定義const常量         例如:
                         const int Max=100;
                         int Array[Max];        
               (2)便于進(jìn)行類型檢查            例如:
                         void f(const int i) { .........}
                    編譯器就會(huì)知道i是一個(gè)常量,不允許修改;
               (3)可以保護(hù)被修飾的東西,防止意外的修改,增強(qiáng)程序的健壯性。
                    還是上面的例子,如果在函數(shù)體內(nèi)修改了i,編譯器就會(huì)報(bào)錯(cuò);
                    例如: 
                         void f(const int i) { i=10;//error! }
                (5) 為函數(shù)重載提供了一個(gè)參考。
                     class A
                     {
                       ......
                       void f(int i)       {......} file://一個(gè)函數(shù)
                       void f(int i) const {......} file://上一個(gè)函數(shù)的重載
                        ......
                      };
                 (6) 可以節(jié)省空間,避免不必要的內(nèi)存分配。
                     例如:
                          #define PI 3.14159         file://常量宏
                          const doulbe  Pi=3.14159;  file://此時(shí)并未將Pi放入ROM中
                          ......
                          double i=Pi;               file://此時(shí)為Pi分配內(nèi)存,以后不再分配!
                          double I=PI;               file://編譯期間進(jìn)行宏替換,分配內(nèi)存
                          double j=Pi;               file://沒(méi)有內(nèi)存分配
                          double J=PI;               file://再進(jìn)行宏替換,又一次分配內(nèi)存!
                     const定義常量從匯編的角度來(lái)看,只是給出了對(duì)應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過(guò)程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個(gè)拷貝。
                 (7) 提高了效率。
                       編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。

            使用const
               (1)修飾一般常量,常數(shù)組,常對(duì)象
               修飾符const可以用在類型說(shuō)明符前,也可以用在類型說(shuō)明符后。      例如:   
                       int const x=2;  或  const int x=2;

                   int const a[5]={1, 2, 3, 4, 5};    或  const int a[5]={1, 2, 3, 4, 5};

                       class A;      const A a;  或     A const a;
                 
               (2)修飾指針
                    const int *A;   或  int const *A; //const修飾指向的對(duì)象,A可變,A指向的對(duì)象不可變
                    int *const A;              //const修飾指針A,     A不可變,A指向的對(duì)象可變 
                    const int *const A;      //指針A和A指向的對(duì)象都不可變
               (3)修飾引用
                    const double & v;      該引用所引用的對(duì)象不能被更新
             (4)修飾函數(shù)的返回值:
                    const修飾符也可以修飾函數(shù)的返回值,是返回值不可被改變,格式如下:
                        const int Fun1(); 
                        const MyClass Fun2();
               (5)修飾類的成員函數(shù):
                    const修飾符也可以修飾類的成員函數(shù),格式如下:
                        class ClassName 
                 {
                         public:
                              int Fun() const;
                                .....
                         };
                    這樣,在調(diào)用函數(shù)Fun時(shí)就不能修改類里面的數(shù)據(jù) 
                (6)在另一連接文件中引用const常量
                     extern const int i;     //正確的引用
                     extern const int j=10;  //錯(cuò)誤!常量不可以被再次賦值
               


            *******************放在類內(nèi)部的常量有什么限制?
              
                    class A
                    {
                     private:
                       const int c3 = 7;               // err
                       static int c4 = 7;               // err
                       static const float c5 = 7;  // err
                      ......
              };
             初始化類內(nèi)部的常量
                    1 初始化列表:
                     class A
                     {
                      public:
                            A(int i=0):test(i) {}
                      private:
                            const int i;
                      };
                     2 外部初始化,例如:
                     class A
                     {
                      public:
                            A() {}
                      private:
                            static const int i;  
                      };
                      const int A::i=3; 

            posted @ 2011-07-26 07:13 RTY 閱讀(213) | 評(píng)論 (0)編輯 收藏

            1.虛函數(shù)
            1.1虛函數(shù)的作用
            虛函數(shù)的作用是允許在派生類中重新定義與基類同名的函數(shù),并且可以通過(guò)基類指針或引用來(lái)訪問(wèn)基類和派生類中的同名函數(shù)。
            class Time{
              public:
                Time(int=0,int=0,int=0);
                void show();
              protected:
                int hour;
                int min;
                int sec;
            };
             
            class LocalTime:public Time{
              public:
                LocalTime(int=0,int=0,int=0,string="+8");
                void show();
              protected:
                string zone;
            };
             
            Time::Time(int h,int m,int s):hour(h),min(m),sec(s){}
             
            void Time::show(){
              cout<<hour<<":"<<min<<":"<<sec<<endl;
            }
             
            LocalTime::LocalTime(int h,int m,int s,string z):Time(h,m,s),zone(z){}
             
            void LocalTime::show(){
              cout<<hour<<":"<<min<<":"<<sec<<"@"<<zone<<endl;    
            }
             
            int main(){
              Time t;
              LocalTime lt;
              Time *pt=&t;
              pt->show();
              pt=&lt;
              pt->show();
              system("PAUSE");
              return EXIT_SUCCESS;
            }
            結(jié)果:
            0:0:0
            0:0:0
            這里通過(guò)指針找到派生類,但無(wú)法調(diào)用派生類show()。如果使用虛函數(shù)。
            將基類Time中的show()函數(shù)聲明為虛函數(shù), 其余不變。
            class Time{
              public:
                Time(int=0,int=0,int=0);
                virtual void show();
            };
            結(jié)果:
            0:0:0
            0:0:0@+8
            本來(lái),基類指針是指向基類對(duì)象的,如果用它指向派生類對(duì)象,則進(jìn)行指針類型轉(zhuǎn)換,將派生類對(duì)象的指針先轉(zhuǎn)換為基類指針,所以基類指針指向的是派生類對(duì)象中的基類部分。在程序修改前,是無(wú)法通過(guò)基類指針去調(diào)用派生類對(duì)象中的成員函數(shù)的。
            虛函數(shù)突破這一限制,在派生類的基類部分中,派生類的虛函數(shù)取代了基類原來(lái)的虛函數(shù),因此在使用基類指針指向派生類對(duì)象后,調(diào)用虛函數(shù)時(shí)就調(diào)用了派生類的虛函數(shù)。
             
            1.2虛函數(shù)的使用方法
            【1】在基類用virtual聲明成員函數(shù)為虛函數(shù)。這樣就可以在派生類中重新定義此函數(shù),為它賦予新的功能,并能方便地被調(diào)用。
             
            【2】在派生類中重新定義此函數(shù),要求函數(shù)名、函數(shù)(返回)類型、函數(shù)參數(shù)個(gè)數(shù)和類型與基函數(shù)的虛函數(shù)相同。如果在派生類中沒(méi)有對(duì)基類的虛函數(shù)重定義,則派生類簡(jiǎn)單地繼承直接基類的虛函數(shù)。
            有一種情況例外,在這種情況下派生類與基類的成員函數(shù)返回類型不同,但仍起到虛函數(shù)的作用。即基類虛函數(shù)返回一個(gè)基類指針或基類引用,而子類的虛函數(shù)返回一個(gè)子類的指針或子類的引用。
            class Base{
              public:
                virtual Base *fun(){
                  cout<<"Base's fun()."<<endl;
                  return this;
                }
            };
             
            class Derived:public Base{
              public:
                virtual Derived *fun(){
                  cout<<"Derived's fun()."<<endl;
                  return this;
                }
            };
             
            void test(Base &x){
              Base *b;
              b=x.fun();
            }
             
            int main(){
              Base b; 
              Derived d;
              test(b);
              test(d);   
              system("PAUSE");
              return EXIT_SUCCESS;
            }
            結(jié)果:
            Base's fun().
            Derived's fun().
             
            【3】C++規(guī)定,當(dāng)一個(gè)成員函數(shù)被聲明為虛函數(shù)后,其派生類中的同名函數(shù)(符合2中定義的函數(shù))都自動(dòng)成為虛函數(shù)。
             
            【4】定義一個(gè)指向基類對(duì)象的指針變量,并使其指向同一類族中的某個(gè)對(duì)象。通過(guò)該指針變量調(diào)用此函數(shù),此時(shí)調(diào)用的就是指針變量指向的對(duì)象的同名函數(shù)。
             
            1.3聲明虛函數(shù)的限制
            【1】只能用virtual聲明類的成員函數(shù),使它成為虛函數(shù),而不能將類外的普通函數(shù)聲明為虛函數(shù)。
             
            【2】一個(gè)成員函數(shù)被聲明為虛函數(shù)后,在同一類族中的類就不能再定義一個(gè)非virtual的但與該虛函數(shù)具有相同參數(shù)(個(gè)數(shù)與類型)和函數(shù)返回值類型的同名函數(shù)。
             
            【3】靜態(tài)成員函數(shù)不能是虛函數(shù),因?yàn)殪o態(tài)成員函數(shù)不受限于某個(gè)對(duì)象。
             
            【4】inline函數(shù)不能是虛函數(shù),因?yàn)閕nline函數(shù)是不能在運(yùn)行中動(dòng)態(tài)確定其位置的。即使虛函數(shù)在類的內(nèi)部定義,編譯時(shí),仍將其視為非inline的。
             
            【5】使用虛函數(shù),系統(tǒng)要有一定的空間開銷。當(dāng)一個(gè)類帶有虛函數(shù)時(shí),編譯器會(huì)為該類構(gòu)造一個(gè)虛函數(shù)表(virtual function tanle,vtable),它是一個(gè)指針數(shù)組,存放每個(gè)虛函數(shù)的入口地址。
            2.虛析構(gòu)函數(shù)
            class Time{
              public:
                Time(int=0,int=0,int=0);
                ~Time(){
                  cout<<"Time destructor"<<endl;
                }       
              protected:
                int hour;
                int min;
                int sec;
            };           
             
            class LocalTime:public Time{
              public:
                LocalTime(int=0,int=0,int=0,string="+8");
                ~LocalTime(){
                  cout<<"LocalTime destructor"<<endl;
                }
              protected:
                string zone;
            };                 
             
            Time::Time(int h,int m,int s):hour(h),min(m),sec(s){}
             
            LocalTime::LocalTime(int h,int m,int s,string z):Time(h,m,s),zone(z){}
             
            int main(){
              Time *p=new LocalTime;//指向派生類
              delete p;  
              system("PAUSE");
              return EXIT_SUCCESS;
            }
            結(jié)果:
            Time destructor
            從結(jié)果可以看出,執(zhí)行的還是基類的析構(gòu)函數(shù),而程序的本意是希望執(zhí)行派生類的析構(gòu)函數(shù)。此時(shí)將基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù),
            virtual ~Time(){
              cout<<"Time destructor"<<endl;
            }
            結(jié)果:
            LocalTime destructor
            Time destructor
            如果將基類的析構(gòu)函數(shù)聲明為虛函數(shù),由該基類所派生的所有派生類的析構(gòu)函數(shù)也自動(dòng)成為虛函數(shù)。
            把基類的析構(gòu)函數(shù)聲明為虛函數(shù)的好處是,如果程序中delete一個(gè)對(duì)象,而delete運(yùn)算符的操作對(duì)象是指向派生類對(duì)象的基類指針,則系統(tǒng)會(huì)調(diào)用相應(yīng)類的析構(gòu)函數(shù)。
            構(gòu)造函數(shù)不能聲明為虛函數(shù)。
            3.純虛函數(shù)
            virtual void show()=0;//純虛函數(shù)
            這里將show()聲明為純虛函數(shù)(pure virtual function)。純虛函數(shù)是在聲明虛函數(shù)時(shí)被“初始化”為0的虛函數(shù)。
            聲明純虛函數(shù)的一般形式為,
            virtual 函數(shù)類型 函數(shù)名(參數(shù)列表)=0;
            純虛函數(shù)沒(méi)有函數(shù)體;最后的“=0”并不代表函數(shù)返回值為0,它只起形式上的作用,告訴編譯器“這是純虛函數(shù)”;這個(gè)一個(gè)聲明語(yǔ)句,最后有分號(hào)。
            聲明純虛函數(shù)是告訴編譯器,“在這里聲明了一個(gè)虛函數(shù),留待派生類中定義”。在派生類中對(duì)此函數(shù)提供了定義后,它才能具備函數(shù)的功能,可以被調(diào)用。
            純虛函數(shù)的作用是在基類中為其派生類保留了一個(gè)函數(shù)的名字,以便派生類根據(jù)需要對(duì)它進(jìn)行定義。
            如果在一個(gè)類中聲明了純虛函數(shù),而在其派生類中沒(méi)有對(duì)該函數(shù)定義,則該函數(shù)在派生類中仍為純虛函數(shù)。
            4.抽象類
            將不用來(lái)定義對(duì)象而只作為一種基本類型用作繼承的類,稱為抽象類(abstract class),由于它常用作基類,通常稱為抽象基類。凡是包含純虛函數(shù)的類都是抽象類。
            如果在派生類中沒(méi)有對(duì)所有的純虛函數(shù)進(jìn)行定義,則此派生類仍然是抽象類,不能用來(lái)定義對(duì)象。
            可以定義指向抽象類數(shù)據(jù)的指針變量。當(dāng)派生類成為具體類后,就可以用這個(gè)指針指向派生類對(duì)象,然后通過(guò)該指針調(diào)用虛函數(shù)。

            posted @ 2011-07-26 06:59 RTY 閱讀(470) | 評(píng)論 (0)編輯 收藏

            1.  Qt 全局宏定義

            Qt版本號(hào):

             QT_VERSION :  (major << 16) + (minor << 8) + patch

            檢測(cè)版本號(hào):

            QT_VERSION_CHECK(major, minor, patch)((major<<16)|(minor<<8)|(patch))

            當(dāng)使用命名空間時(shí)的一些宏定義:

            namespace QT_NAMESPACE {} //命名空間定義

            # define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name

            # define QT_USE_NAMESPACE using namespace ::QT_NAMESPACE;

            # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {

            # define QT_END_NAMESPACE }

            # define QT_BEGIN_INCLUDE_NAMESPACE }

            # define QT_END_INCLUDE_NAMESPACE namespace QT_NAMESPACE {

            # define QT_BEGIN_MOC_NAMESPACE QT_USE_NAMESPACE

            # define QT_END_MOC_NAMESPACE

            # define QT_FORWARD_DECLARE_CLASS(name) /

                QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE /

                using QT_PREPEND_NAMESPACE(name);

             

            # define QT_FORWARD_DECLARE_STRUCT(name) /

                QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE /

                using QT_PREPEND_NAMESPACE(name);

            Q_GLOBAL_STATIC(type, name)用于定義一個(gè)全局的靜態(tài)變量(線程安全的).用它來(lái)初始化一個(gè)對(duì)象指針(函數(shù)指針).

            Q_GLOBAL_STATIC_WITH_ARGS(type, name, arguments):同上,可帶參數(shù).

             

            Q_UNUSED():通常用于某個(gè)函數(shù)的參數(shù),表明該參數(shù)未在方法體中使用.

            常用數(shù)據(jù)類型:

            qint8, quint8, qint16, quint16, qint32, quint32, qint64, quint64, qlonglong(=int64), qulonglong(=uint64)

            quintptr, qptrdiff, 作為指針是一樣大的.如:

                  sizeof(void *) == sizeof(quintptr)

                  && sizeof(void *) == sizeof(qptrdiff)

            Qt有用的類型定義:uchar, ushort, uint, ulong

            實(shí)用內(nèi)聯(lián)函數(shù):qAbs(), qRound(), qRound64(), qMin(), qMax(), qBound();

            try-catch宏:

            #ifdef QT_NO_EXCEPTIONS

            #  define QT_TRY if (true)

            #  define QT_CATCH(A) else

            #  define QT_THROW(A) qt_noop()

            #  define QT_RETHROW qt_noop()

            #else

            #  define QT_TRY try

            #  define QT_CATCH(A) catch (A)

            #  define QT_THROW(A) throw A

            #  define QT_RETHROW throw

            #endif

            每個(gè)QT_TRY對(duì)應(yīng)一個(gè)QT_CATCH,不要在catch語(yǔ)句塊中使用異常實(shí)例.

             

            調(diào)試相關(guān)函數(shù):

            qDebug(), qWarnig(), qCritical(), Q_ASSERT()

             

            其他一些函數(shù):

            該宏用于定義某個(gè)類,禁止拷貝

            #define Q_DISABLE_COPY(Class) /

                Class(const Class &); /

                Class &operator=(const Class &);

            qgetenv(), qputenv(), qIntCast(double 或float). qsrand(uint seed), qrand()

            2. Qt的內(nèi)存管理函數(shù)

            void *qMalloc(size_t size);

            void qFree(void *ptr);

            void *qRealloc(void *ptr, size_t size);

            void *qMallocAligned(size_t size, size_t alignment)

            void *qReallocAligned(void *oldptr, size_t newsize, size_t oldsize, size_t alignment)

            void qFreeAligned(void *ptr)

            void *qMemCopy(void *dest, const void *src, size_t n);

            void *qMemSet(void *dest, int c, size_t n);

            注: 數(shù)組下標(biāo)為-1的地址對(duì)于數(shù)組來(lái)說(shuō)是越界訪問(wèn)了,但是這個(gè)地址是有意義的.這個(gè)地址就是所申請(qǐng)的數(shù)組存儲(chǔ)空間的首地址的向前偏移一個(gè)單位(也就是偏移一個(gè)當(dāng)前數(shù)組類型所對(duì)應(yīng)的字節(jié)數(shù))所對(duì)應(yīng)的地址。這個(gè)地址由于沒(méi)有跟著數(shù)組空間一起初始化,所以其中的數(shù)據(jù)是不確定的.如果是正在被系統(tǒng)或者其他應(yīng)用程序使用中的地址空間,那么可以被訪問(wèn),其中的數(shù)據(jù)的意義取決于被系統(tǒng)或者其他應(yīng)用程序所寫入的數(shù)據(jù),但是訪問(wèn)后,有可能會(huì)引起系統(tǒng)或者其他應(yīng)用程序異常。如果是沒(méi)有被使用的地址,那么就是一個(gè)野地址,那么其中的數(shù)據(jù)是隨機(jī)的,無(wú)意義的

             

            3. 環(huán)境變量設(shè)置函數(shù)

            qputenv():與putenv()基本類似,由于VC2005后廢除了putenv()函數(shù),所有定義了此函數(shù),在VC環(huán)境中調(diào)用替代的函數(shù),其他平臺(tái)調(diào)用標(biāo)準(zhǔn)C庫(kù)函數(shù)putenv().

            qgetenv():獲取某個(gè)環(huán)境變量的值.

             

            4.自定義輸出函數(shù)

            QtMsgHandler qInstallMsgHandler(QtMsgHandler h)

            其中:typedef void (*QtMsgHandler)(QtMsgType, const char *);

            利用該函數(shù)可定制自己的調(diào)試信息輸出.

             

            5. 斷言

            Q_ASSERT(bool test):當(dāng)斷言失敗時(shí),打印出警告信息,包含了源碼文件名和行號(hào).

            void Q_ASSERT_X(bool test, const char *where, const char *what)

             

            void Q_CHECK_PTR(void *pointer):檢測(cè)非法指針,如果指針為0,打印警告信息.

             

            6.系統(tǒng)信息類QsysInfo

            posted @ 2011-07-26 06:53 RTY 閱讀(4255) | 評(píng)論 (0)編輯 收藏

                 摘要: 比起源碼級(jí)別的模塊化,二進(jìn)制級(jí)別的模塊劃分使得各模塊更加獨(dú)立,各模塊可以分別編譯和鏈接,模塊的升級(jí)不會(huì)引起其它模塊和主程序的重新編譯,這點(diǎn)對(duì)于大系統(tǒng)的構(gòu)建來(lái)說(shuō)更加實(shí)用。AD:繼續(xù) Qt編寫模塊化插件式應(yīng)用程序 (上篇) 的內(nèi)容繼續(xù)介紹,本節(jié)介紹的是Qt編寫模塊化插件式應(yīng)用程序 (下篇),我們先來(lái)看內(nèi)容。2. 編寫Animal插件——BilDog和BilP...  閱讀全文

            posted @ 2011-07-26 06:42 RTY 閱讀(595) | 評(píng)論 (0)編輯 收藏

                 摘要: 比起源碼級(jí)別的模塊化,二進(jìn)制級(jí)別的模塊劃分使得各模塊更加獨(dú)立,各模塊可以分別編譯和鏈接,模塊的升級(jí)不會(huì)引起其它模塊和主程序的重新編譯,這點(diǎn)對(duì)于大系統(tǒng)的構(gòu)建來(lái)說(shuō)更加實(shí)用。AD:動(dòng)態(tài)鏈接庫(kù)技術(shù)使軟件工程師們獸血沸騰,它使得應(yīng)用系統(tǒng)(程序)可以以二進(jìn)制模塊的形式靈活地組建起來(lái)。比起源碼級(jí)別的模塊化,二進(jìn)制級(jí)別的模塊劃分使得各模塊更加獨(dú)立,各模塊可以分別編譯和鏈接,模塊的升級(jí)不會(huì)引起其它模塊和主程序的重新...  閱讀全文

            posted @ 2011-07-26 06:40 RTY 閱讀(529) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共31頁(yè): First 11 12 13 14 15 16 17 18 19 Last 
            久久综合九色综合久99| 91久久国产视频| 国产精品九九久久免费视频 | 日韩乱码人妻无码中文字幕久久| 7777久久亚洲中文字幕| 久久综合偷偷噜噜噜色| 99热热久久这里只有精品68| 国内精品久久久久久久久电影网 | 97久久天天综合色天天综合色hd| 国产高潮国产高潮久久久91| 久久男人Av资源网站无码软件| 久久综合伊人77777| 一本久久a久久精品综合夜夜| 欧美熟妇另类久久久久久不卡 | 国产精品久久久亚洲| 久久亚洲sm情趣捆绑调教| 精品欧美一区二区三区久久久 | 亚洲精品tv久久久久久久久| 午夜精品久久久久久| 精品久久人人爽天天玩人人妻 | 中文字幕成人精品久久不卡| 无码人妻精品一区二区三区久久| 亚洲精品美女久久久久99小说| 丁香久久婷婷国产午夜视频| 69SEX久久精品国产麻豆| 亚洲国产另类久久久精品 | 亚洲国产成人精品91久久久| 久久99精品国产麻豆蜜芽| 久久精品免费观看| 国内精品久久久久影院免费| 国产精品99久久免费观看| 久久国产热精品波多野结衣AV | 亚洲va久久久噜噜噜久久狠狠 | 国产 亚洲 欧美 另类 久久| 国产亚洲美女精品久久久久狼| 国产精品一区二区久久国产| 久久久久亚洲AV无码专区体验| 一本色道久久HEZYO无码| 久久人人爽人人爽人人AV东京热| 色婷婷综合久久久中文字幕| 久久久久亚洲AV无码永不|