• <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>
            隨筆 - 30, 文章 - 0, 評(píng)論 - 64, 引用 - 0
            數(shù)據(jù)加載中……

            從Java到C++ — 對(duì)比Java與C++編程的不同

            1. 數(shù)據(jù)類型和變量

            C++ 中的變量類型與Java很相似。像Java一樣,C++ 有intdouble 類型。但是這些數(shù)字類型的取值范圍是依賴于機(jī)器的。比如在16位系統(tǒng)上,例如運(yùn)行DOS 或Windows 3.x的PC機(jī)上,int 是雙字節(jié)(2-byte)的,取值范圍比Java的4-byte的int 要小很多。在這些機(jī)器上,如果 int 不夠用的話,你需要使用長(zhǎng)整型long。

            C++ 有 shortunsigned 類型來更有效的存儲(chǔ)數(shù)字。(我認(rèn)為所謂有效是指更高的空間利用率。) 最好是盡量避免使用這些類型除非是空間利用的有效性對(duì)你的系統(tǒng)真的非常重要。

            在C++中布爾型用 bool 表示,而不像在Java中用boolean。

            C++ 中字符串類型用 string 表示。它與Java中的 String 類型非常相似,但是,還是要逐一以下幾點(diǎn)不同之處:

            1. C++ 字符串存儲(chǔ)ASCII 碼字符,而不是標(biāo)準(zhǔn)碼Unicode 字符

            2. C++ 字符串是可以被修改的,而Java字符串的內(nèi)容是不可修改的(immutable)。

            3. 取子字符串的操作在 C++ 中叫做 substr,這個(gè)命令s.substr(i, n) 從字符串s中取得從位置 i 開始長(zhǎng)度為n的子字符串。

            4. 在C++中,你只能夠?qū)⒆址c其它字符串對(duì)象相串聯(lián)(concatenate),而不能夠與任意的對(duì)象相串聯(lián)。

            5. C++中可以直接使用關(guān)系操作符 ==、 !=、 <、 <=、 >、 >= 來進(jìn)行字符串比較,其中后面四個(gè)操作符是按字母順序進(jìn)行比較的。 這比Java中使用函數(shù)equals和compareTo來比較要方便很多。



            2. 變量和常量

            在C++中,本地變量的定義看起來與Java中相同,例如:

            int n = 5;

            實(shí)際上這正是C++和Java的一個(gè)重要不同之處。C++編譯器不對(duì)本地變量進(jìn)行初始化檢驗(yàn),所以在C++中很容易忘記初始化一個(gè)變量,這種情況下,變量的值該變量所占內(nèi)存區(qū)域中剛好當(dāng)前存在隨機(jī)值。這顯然是很容易產(chǎn)生程序出錯(cuò)的地方。

            與Java一樣, C++中類可以有數(shù)據(jù)域和靜態(tài)變量。不同的是,C++中變量可以在函數(shù)甚至是類的外面定義,這些所謂的全局變量可以在程序的任何函數(shù)中被訪問,因而不易被很好的管理。所C++中應(yīng)該盡量避免使用全局變量。

            在C++中,常量可以在任何地方被定義(記得在Java中,常量必須是類的靜態(tài)數(shù)據(jù)static data)。 C++ 使用關(guān)鍵字 const 來定義常量,而Java中是 final。例如:

            const int DAYS_PER_YEAR = 365;




            3. 類

            C++ 中對(duì)類的定義與Java有些不同,這里是一個(gè)例子:一個(gè)C++ 版本的 Point 類:

            class Point /* C++ */

            {

            public:

            Point();

            Point(double xval, double yval);

            void move(double dx, double dy);

            double getX() const;

            double getY() const;

            private:

            double x;

            double y;

            };

            這里幾點(diǎn)重要的不同是:

            1. C++的類定義中分為公共和私有部分,分別以關(guān)鍵字 publicprivate開始。而在Java中,每一個(gè)元素都必須標(biāo)明 publicprivate

            2. C++中類的定義只包含函數(shù)的聲明,真正的實(shí)現(xiàn)另外單獨(dú)列出。

            3. 訪問函數(shù)(accessor methods)標(biāo)有關(guān)鍵字 const ,表明這個(gè)函數(shù)不會(huì)改變本對(duì)象的元素值。

            4. 類定義的結(jié)尾處有分號(hào)

            類中函數(shù)的實(shí)現(xiàn)跟在類的定義之后。因?yàn)楹瘮?shù)是在類外面定義的,所以每一個(gè)函數(shù)的名字前面要加類名稱作為前綴,并使用操作符雙冒號(hào)::來分割類的名稱和函數(shù)的名稱。不改變隱含參數(shù)值(即當(dāng)前對(duì)象的值)的訪問函數(shù)用 const標(biāo)明。如下所示是上面類定義中的函數(shù)的實(shí)現(xiàn):

            Point::Point() { x = 0; y = 0; }

            void Point::move(double dx, double dy)

            {

            x = x + dx;

            y = y + dy;

            }

            double Point::getX() const

            {

            return x;

            }




            4. 對(duì)象

            Java 與 C++ 最主要的不同在于對(duì)象變量的使用。在 C++中,對(duì)象變量存儲(chǔ)的是真正的對(duì)象的值,而不是對(duì)象引用(reference)。注意在C++中構(gòu)造一個(gè)對(duì)象的時(shí)候是不使用關(guān)鍵字new的,只需要在變量的名字后面直接賦予構(gòu)造函數(shù)的參數(shù)就可以了,例如:

            Point p(1, 2); /* 構(gòu)造對(duì)象 p */

            如果不跟參數(shù)賦值,則使用默認(rèn)構(gòu)造函數(shù),例如:

            Time now; /* 默認(rèn)使用構(gòu)造函數(shù) Time::Time() */

            這一點(diǎn)與Java很不同。在Java中,這個(gè)命令僅僅生成一個(gè)沒有初始化的reference,而在C++中,它生成一個(gè)實(shí)際的對(duì)象。

            當(dāng)一個(gè)對(duì)象被賦給另一個(gè)對(duì)象變量的時(shí)候,實(shí)際的值將被拷貝。而在Java中,拷貝一個(gè)對(duì)象變量只不過是建立了另外一個(gè)指向?qū)ο蟮膔eference。拷貝一個(gè)C++的對(duì)象就像在Java中調(diào)用clone這個(gè)函數(shù)一樣,而修改拷貝的值不會(huì)改變?cè)瓕?duì)象的值。例如:

            Point q = p; /* 拷貝p到q */

            q.move(1, 1); /* 移動(dòng)q而p不動(dòng),即q的值變了,而p的不變*/

            多數(shù)情況下,C++中這種對(duì)象直接對(duì)值操作的特性使用起來很方便,但是也有些時(shí)候不盡如人意:

            1. 當(dāng)需要一個(gè)函數(shù)中修改一個(gè)對(duì)象的值,必須記住要使用按引用調(diào)用call by reference (參見下面函數(shù)部分)

            2. 兩個(gè)對(duì)象變量不能指向同一個(gè)對(duì)象實(shí)體。如果你要在C++中實(shí)現(xiàn)這種效果,必須使用指針pointer(參見下面指針部分)

            3. 一個(gè)對(duì)象變量只能存儲(chǔ)一種特定的類型的值,如果你想要使用一個(gè)變量來存儲(chǔ)不同子類的對(duì)象的值(多態(tài)ploymorphism),則需要使用指針。

            4. 如果你想在C++中使用一個(gè)變量來或者指向null或者指向一個(gè)實(shí)際的對(duì)象,則需要使用指針






            5. 函數(shù)

            在Java中,每一個(gè)函數(shù)必須或者是對(duì)象函數(shù)(instance method),或者是靜態(tài)函數(shù)(static function)或稱類函數(shù)。C++同樣支持對(duì)象函數(shù)和靜態(tài)函數(shù)(類函數(shù)),但同時(shí)C++也允許定義不屬于任何類的函數(shù),這些函數(shù)叫做全局函數(shù)(global functions)

            特別的是,每一個(gè)C++ 程序都從一個(gè)叫做 main的全局函數(shù)開始執(zhí)行:

            int main()

            { . . .

            }

            還有另外一個(gè)格式的main函數(shù)可以用來捕捉命令行參數(shù),類似于Java的main函數(shù),但是它要求關(guān)于C格式的數(shù)組和字符串的知識(shí),這里就不介紹了。

            按照習(xí)慣,通常如果程序執(zhí)行成功, main 函數(shù)返回0,否則返回非零整數(shù)。

            同Java一樣,函數(shù)參數(shù)是通過值傳遞的(passed by value)。在Java中,函數(shù)無論如何都是可以修改對(duì)象的值的。然而在C++中,因?yàn)閷?duì)象直接存儲(chǔ)的是實(shí)際的值,而不是指向值的reference,也就是說傳入函數(shù)的是一個(gè)實(shí)際值的拷貝,因此也就無法修改原來對(duì)象的值。

            所以,C++ 有兩種參數(shù)傳遞機(jī)制,同Java一樣的按值調(diào)用(call by value) ,以及按地址調(diào)用(call by reference)。當(dāng)一個(gè)參數(shù)是按reference傳遞時(shí),函數(shù)可以修改其原始值。Call by reference 的參數(shù)前面有一個(gè)地址號(hào) & 跟在參數(shù)類型的后面,例如:

            void raiseSalary(Employee& e, double by)

            { . . .

            }

            下面是一個(gè)典型的利用call by reference的函數(shù),在Java中是無法實(shí)現(xiàn)這樣的功能的。

            void swap(int& a, int& b)

            { int temp = a;

            a = b;

            b = temp;

            }

            如果使用 swap(x, y)來調(diào)用這個(gè)函數(shù),則reference參數(shù) ab 指向原實(shí)際參數(shù)xy的位置,而不是它們的值的拷貝,因此這個(gè)函數(shù)可以實(shí)現(xiàn)實(shí)際交換這兩個(gè)參數(shù)的值。

            在 C++中,每當(dāng)需要實(shí)現(xiàn)修改原參數(shù)的值時(shí)你就可以使用按地址調(diào)用 call by reference




            6. 向量Vector

            C++ 的向量結(jié)構(gòu)結(jié)合了Java中數(shù)組和向量?jī)烧叩膬?yōu)點(diǎn)。一個(gè)C++ 的向量可以方便的被訪問,其容量又可以動(dòng)態(tài)的增長(zhǎng)。如果 T 是任意類型,則 vector<T> 是一個(gè)元素為 T 類型的動(dòng)態(tài)數(shù)組。下面的語句

            vector<int> a;

            產(chǎn)生一個(gè)初始為空的向量。而語句

            vector<int> a(100);

            生成一個(gè)初始有100個(gè)元素的向量。你可以使用push_back 函數(shù)來添加元素:

            a.push_back(n);

            調(diào)用 a.pop_back()a中取出最后一個(gè)元素(操作后這個(gè)元素被從a中刪掉), 使用函數(shù)size 可以得到當(dāng)前a中的元素個(gè)數(shù)。

            你還可以通過我們熟悉的 [] 操作符來訪問向量中元素,例如:

            for (i = 0; i < a.size(); i++) {

            sum = sum + a[i];

            }

            同Java中一樣,數(shù)組索引必須為 0 和 a.size() - 1之間的值。但是與Java不同的是,C++中沒有runtime的索引號(hào)合法性檢驗(yàn)。試圖訪問非法的索引位置可能造成非常嚴(yán)重的出錯(cuò)。

            就像所有其它 C++ 對(duì)象一樣,向量也是值。如果你將一個(gè)向量賦值給另外一個(gè)向量變量,所有的元素都會(huì)被拷貝過去。

            vector<int> b = a; /* 所有的元素都被拷貝了 */

            對(duì)比Java中的情況,在Java中,一個(gè)數(shù)組變量是一個(gè)指向數(shù)組的reference。拷貝這個(gè)變量?jī)H僅產(chǎn)生另外一個(gè)指向同一數(shù)組的reference,而不會(huì)拷貝每一個(gè)元素的值。

            正因如此,如果一個(gè)C++函數(shù)要實(shí)現(xiàn)修改向量的值,必須使用reference參數(shù):

            void sort(vector<int>& a)

            { . . .

            }




            7. 輸入和輸出

            在C++中,標(biāo)準(zhǔn)的輸入輸出流用對(duì)象 cincout 表示。我們使用 << 操作符寫輸出,例如:

            cout << “Hello, World!”;

            也可以連著輸出多項(xiàng)內(nèi)容,例如:

            cout << “The answer is ” << x << “\n”;

            我們使用 >> 操作符來讀入一個(gè)數(shù)字或單詞,例如:

            double x;

            cout << “Please enter x: “;

            cin >> x;

            string fname;

            cout << “Please enter your first name: “;

            cin >> fname;

            函數(shù)getline 可以讀入整行的輸入,例如:

            string inputLine;

            getline(cin, inputLine);

            如果到達(dá)輸入的結(jié)尾,或者一個(gè)數(shù)字無法被正確的讀入,這個(gè)流對(duì)象會(huì)被設(shè)置為 failed 狀態(tài),我們可以使用函數(shù) fail 來檢驗(yàn)這個(gè)狀態(tài),例如:

            int n;

            cin >> n;

            if (cin.fail()) cout << “Bad input”;

            一旦一個(gè)流的狀態(tài)被設(shè)為failed,我們是很難重置它的狀態(tài)的,所以如果你的程序需要處理錯(cuò)誤輸入的情況,應(yīng)該使用函數(shù) getline 然后人工處理得到的輸入數(shù)據(jù)。

             

             



            8. 指針pointer

            我們已經(jīng)知道在C++中,對(duì)象變量直接存儲(chǔ)的是對(duì)象的值。這是與Java不同的,在Java中對(duì)象變量存儲(chǔ)的是一個(gè)地址,該地址指向?qū)ο笾祵?shí)際存儲(chǔ)的地方。有時(shí)在C++中也需要實(shí)現(xiàn)這樣的布置,這就用到了指針pointer。在 C++中,一個(gè)指向?qū)ο蟮淖兞拷凶鲋羔槨H绻鸗是一種數(shù)據(jù)類型,則 T* 是指向這種數(shù)據(jù)類型的指針。

            就像 Java中一樣,一個(gè)指針變量可以被初始化為空值 NULL,另外一個(gè)指針變量的值,或者一個(gè)調(diào)用new生成的新對(duì)象:

            Employee* p = NULL;

            Employee* q = new Employee(”Hacker, Harry”, 35000);

            Employee* r = q;

            實(shí)際上在C++中還有第四種可能,那就是指針可以被初始化為另外一個(gè)對(duì)象的地址,這需要使用地址操作符 &

            Employee boss(”Morris, Melinda”, 83000);

            Employee* s = &boss;

            這實(shí)際上并不是什么好主意。保險(xiǎn)的做法還是應(yīng)該直接讓指針指向使用 new生成的新對(duì)象。

            到目前為止,C++ 指針看起來非常像 Java 的對(duì)象變量。然而,這里有一個(gè)很重要的語法的不同。我們必須使用星號(hào)操作符 * 來訪問指針指向的對(duì)象。如果 p 是一個(gè)指向Employee對(duì)象的指針,則 *p 才代表了這個(gè)對(duì)象:

            Employee* p = . . .;

            Employee boss = *p;

            當(dāng)我們需要執(zhí)行對(duì)象的函數(shù)或訪問對(duì)象的一個(gè)數(shù)據(jù)域時(shí),也需要使用 *p

            (*p).setSalary(91000);

            *p外面的括號(hào)是必需的,因?yàn)?. 操作符比 * 操作符有更高的優(yōu)先級(jí)。C的設(shè)計(jì)者覺得這種寫法很難看,所以他們提供了另外一種替代的寫法,使用 -> 操作符來實(shí)現(xiàn) *. 操作符的組合功能。表達(dá)式

            p->setSalary(91000);

            可以調(diào)用對(duì)象*p的函數(shù) setSalary 。你可以簡(jiǎn)單的記住 . 操作符是在對(duì)象上使用的,-> 操作符是在指針上使用的。

            如果你不初始化一個(gè)指針,或者如果一個(gè)指針為空值 NULL 或指向的對(duì)象不再存在,則在它上面使用 *-> 操作符就會(huì)出錯(cuò)。 不幸的是 C++ runtime 系統(tǒng)并不檢查這個(gè)出錯(cuò)。如果你范了這個(gè)錯(cuò)誤,你的程序可能會(huì)行為古怪或死機(jī)。

            而在Java中,這些錯(cuò)誤是不會(huì)發(fā)生的。所有的reference都必須初始化,所有的對(duì)象只要仍有reference指向它就不會(huì)被從內(nèi)存中清除,因此你也不會(huì)有一個(gè)指向已被刪除的對(duì)象的reference。Java的runtime 系統(tǒng)會(huì)檢查reference是否為空,并在遇到空指針時(shí)拋出一個(gè)null pointer的例外(exception)。

            C++ 和 Java還有一個(gè)顯著的不同,就是 Java 有垃圾回收功能,能夠自動(dòng)回收被廢棄的對(duì)象。而在C++中,需要程序員自己管理內(nèi)存分配回收。

            C++中當(dāng)對(duì)象變量超出范圍時(shí)可以自動(dòng)被回收。但是使用new生成的對(duì)象必須用delete操作符手動(dòng)刪除,例如:

            Employee* p = new Employee(”Hacker, Harry”, 38000);

            . . .

            delete p; /* 不在需要這個(gè)對(duì)象 */

            如果你忘記刪除一個(gè)對(duì)象,那么你的程序有可能最終用光所有內(nèi)存。這就是我們常說的內(nèi)存泄漏 (memory leak)。更重要的是,如果你如果刪除了一個(gè)對(duì)象,然后又繼續(xù)使用它,你可能覆蓋不屬于你的數(shù)據(jù)。如果你剛巧覆蓋了用于處理內(nèi)存回收的數(shù)據(jù)域,那么內(nèi)存分配機(jī)制就可能運(yùn)轉(zhuǎn)失常而造成更嚴(yán)重的錯(cuò)誤,而且很難診斷和修復(fù)。因此,在C++中最好盡量少用指針




            9. 繼承

            C++和Java中繼承的基本語法是很相似的。在C++中,使用 : public 代替Java中的extends 來表示繼承關(guān)系 。 (C++ 也支持私有繼承的概念,但是不太有用。)

            默認(rèn)情況下,C++中的函數(shù)不是動(dòng)態(tài)綁定的。如果你需要某個(gè)函數(shù)實(shí)現(xiàn)動(dòng)態(tài)綁定,需要使用virtual聲明它為虛函數(shù),例如:

            class Manager : public Employee

            {

            public:

            Manager(string name, double salary, string dept);

            virtual void print() const;

            private:

            string department;

            };

            同Java一樣,構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)有特殊的語法。 Java使用關(guān)鍵字 super。C++中必須在子類的構(gòu)造函數(shù)體外調(diào)用父類的構(gòu)造函數(shù)。下面是一個(gè)例子:

            Manager::Manager(string name, double salary, string dept)

            : Employee(name, salary) /* 調(diào)用父類的構(gòu)造函數(shù) */

            { department = dept;

            }

            Java 中在子類函數(shù)中調(diào)用父類的函數(shù)時(shí)也使用關(guān)鍵字 super 。而在C++中是使用父類的名稱加上操作符 ::表示,例如:

            void Manager::print() const

            { Employee::print(); /* 調(diào)用父類的函數(shù) */

            cout << department << “\n”;

            }

            一個(gè) C++ 對(duì)象變量只能存儲(chǔ)特定類型的對(duì)象值。要想在C++中實(shí)現(xiàn)多態(tài)(polymorphism),必須使用指針。一個(gè) T* 指針可以指向類型為 TT 的任意子類的對(duì)象,例如:

            Employee* e = new Manager(”Morris, Melinda”, 83000, “Finance”);

            你可以將父類和不同子類的對(duì)象混合收集到一個(gè)元素均為指針的向量中,然后調(diào)用動(dòng)態(tài)綁定的函數(shù),如下所示:

            vector<Employee*> staff;

            . . .

            for (i = 0; i < staff.size(); i++)

            staff[i]->print();

            posted on 2008-12-09 13:43 henry08 閱讀(4275) 評(píng)論(32)  編輯 收藏 引用 所屬分類: C++

            評(píng)論

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            "C++ 中的變量類型與Java很相似。像Java一樣,C++ 有int 和 double 類型。"
            這句若能改成
            "Java中的變量類型與C++ 很相似。像C++ 一樣,Java 有int 和 double 類型。"

            就好像我們會(huì)說這個(gè)新來的和過去的那個(gè)一樣
            2008-12-09 15:40 | doyle

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            一直都不屑于java
            1、名詞,概念太多,實(shí)際上唬人而已,花架子;
            2、效率實(shí)在太差了;
            3、用來做快餐的東西,會(huì)是好東西嗎;
            4、寫java程序員的能力,真的有待提高,知識(shí)很表面化,和C++程序員相差實(shí)在太遠(yuǎn)了。
            2008-12-09 16:31 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            1. C++ 字符串存儲(chǔ)ASCII 碼字符,而不是標(biāo)準(zhǔn)碼Unicode 字符

            2. C++ 字符串是可以被修改的,而Java字符串的內(nèi)容是不可修改的(immutable)。
            ========================
            字符串是什么?這在C++的眼里,只不過是一片連續(xù)的內(nèi)存,且這片內(nèi)存可以跨任何平臺(tái);在java眼里,是ASICC,UTF-8,UTF-16這種編碼構(gòu)成的某種神秘物體。
            這就是差別,叫差距行不行?我看行。
            2008-12-09 16:39 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            JAVA寫多了,能力會(huì)退化的。
            我以前寫了6年的C++。然后寫了一年的JAVA,再回頭寫C++,發(fā)現(xiàn)代碼的效率啊,代碼的結(jié)構(gòu),思考的方法等,都退化了。。
            2008-12-09 16:51 | 絕對(duì)零度

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            力挺c++
            2008-12-09 21:14 | 一小步一大步網(wǎng)

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            同意一樓的。我感覺這篇文章本身的題目就不好,仿佛是c++模仿java而來的一樣。
            2008-12-09 23:13 | ppc

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            我是C++出身的,自問有一些水平,一般的C++問題基本都能搞定。后來,由于工作需要,我又學(xué)了Java(不是轉(zhuǎn)成Java,是又多做了一份工作,嘻嘻),用了很久了,對(duì)Java也很了解了。

            我想說的是:
            1、名詞,概念比C++少多了,以實(shí)用為主,摒棄了很多紛繁的技術(shù)細(xì)節(jié);
            2、如果你是用的P4以上的機(jī)器,效率基本不是問題,尤其是在大型Server上;
            3、如果你不認(rèn)為匯編永遠(yuǎn)是最好的選擇,很多場(chǎng)合下,快并不意味著爛;
            4、從對(duì)底層實(shí)現(xiàn)上講,“有些”寫Java程序員的能力,真的有待提高,知識(shí)很表面化,和“大多數(shù)”C++程序員相差實(shí)在太遠(yuǎn)了;但是在大多C++程序員都還在為內(nèi)存每秒泄露1byte而郁悶的時(shí)候,Java程序員卻在想著怎么把功能做得更好;
            5、我加一條,Java的基于大型應(yīng)用系統(tǒng)的很多思想是非常優(yōu)秀的,如果你只做過HelloWorld而已,那你就沒有發(fā)言權(quán)。

            最后聲明一下,作為C++程序員,我永遠(yuǎn)不否認(rèn)C++是最優(yōu)秀的語言之一,在特定的場(chǎng)合下,他甚至是你唯一的選擇。但是,只有最適合的才是最好的。我們不能想象,現(xiàn)在還有誰會(huì)去用C++寫的CGI去構(gòu)建一個(gè)大型的網(wǎng)站或企業(yè)級(jí)應(yīng)用系統(tǒng)(雖然技術(shù)上是可行的);我們也難以相信,有人會(huì)去試圖用Java或PHP去實(shí)現(xiàn)一個(gè)類似OOo的桌面軟件(雖然技術(shù)上是可行的)。
            2008-12-10 08:44 | abettor

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            這位仁兄貌似不知道字符編碼(或者說字符集)是啥東西,估計(jì)大哥沒做過網(wǎng)絡(luò)程序,要不然就是只是內(nèi)部網(wǎng)絡(luò),沒有跟別人的系統(tǒng)連過。任何語言都會(huì)涉及到字符編碼的問題。

            你沒發(fā)現(xiàn)Windows的記事本有時(shí)候打開一個(gè)TXT文件時(shí)會(huì)是亂碼嗎?你覺得那一定就不是真正的文本文件了嗎?Linux下的gedit是Java寫的嗎?為什么他也支持各種字符編碼?
            2008-12-10 08:51 | abettor

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            吃飯就用筷子,架電線就用電線桿,不能亂用,盡管理論上可以用
            2008-12-10 09:45 | zuhd

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @abettor
            如果你的C++很強(qiáng)的話,你真的會(huì)鄙視java,也不屑于寫java代碼。
            CGI?不用這個(gè),因?yàn)槲覀兊膆ttp server是用C++自己寫的,參考了lighttpd,能實(shí)現(xiàn)任何功能,當(dāng)然是我們需要的一些功能.
            2008-12-10 10:57 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @abettor
            這位仁兄貌似不知道字符編碼(或者說字符集)是啥東西,估計(jì)大哥沒做過網(wǎng)絡(luò)程序
            =========================
            我寫的:“字符串是什么?這在C++的眼里,只不過是一片連續(xù)的內(nèi)存,且這片內(nèi)存可以跨任何平臺(tái)”,我真的找不到比這更優(yōu)美的闡述了,哪里有錯(cuò)呢?
            你可能還是java寫多了,所以覺得各種編碼轉(zhuǎn)來轉(zhuǎn)去很神秘吧。
            1、一片連續(xù)的內(nèi)存不用說了,基本概念而已;
            2、這片內(nèi)存跨平臺(tái),可能更本質(zhì)點(diǎn)。因?yàn)锳SSIC, UTF-8, UTF-16(UNICODE)都是國際標(biāo)準(zhǔn),這就表明在任何平臺(tái)他的編碼和內(nèi)存表示應(yīng)該是相同的,你把Win一段字符串的內(nèi)存(不管什么編碼),傳送到任何一個(gè)平臺(tái),所表示出來還會(huì)是相同的東西,這就是我所說的內(nèi)存跨平臺(tái)。
            2008-12-10 11:08 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            呵呵,字符編碼確實(shí)不神秘,Java的String其實(shí)是把字符編碼這個(gè)技術(shù)細(xì)節(jié)給隱藏了,只有需要以某種編碼去處理的時(shí)候,才需要(很easy的)得到他的byte數(shù)據(jù),當(dāng)然,也就可以認(rèn)為是一塊連續(xù)的內(nèi)存(當(dāng)然,仁兄也必然知道,即使是C++層面看的“連續(xù)”的內(nèi)存,在物理上也不一定連續(xù),只是邏輯上是這樣的罷了)。

            我早上的語氣可能有點(diǎn)硬,其實(shí)我的意思是說在某些場(chǎng)合,用Java才是最好的選擇。我很欽佩仁兄自己實(shí)現(xiàn)了一個(gè)http server,許是有特殊的應(yīng)用場(chǎng)合吧。但我不知道你的這個(gè)http server能夠最生產(chǎn)生活提供那些業(yè)務(wù)服務(wù)。我猜可能是用這個(gè)http server去解析類似php或perl這樣的腳本語言來實(shí)現(xiàn)吧。

            說實(shí)話,我的本職是C++程序員,做了3年了,自認(rèn)為脫離了菜鳥行列了。但是,接觸Java后,我發(fā)現(xiàn)我的C++水平立刻提高了一些,這說明什么?具體語言之間其實(shí)并無恩怨,只是大家可能在心里有一些先入為主的偏見。

            還是那句話,最適合的才是最好的。
            2008-12-10 12:20 | abettor

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            對(duì)字符串預(yù)編碼有時(shí)侯是很郁悶的事情.

            D語言在這個(gè)方面的設(shè)計(jì)就讓人很XX. 賦值的字符串直接輸出全部是亂碼, 轉(zhuǎn)來轉(zhuǎn)去的很煩. 還記得當(dāng)初java的Unicode編碼的轉(zhuǎn)換問題嗎?

            C++中字符串和其它的數(shù)值沒什么區(qū)別, 編碼僅在需要的時(shí)侯才轉(zhuǎn)換(轉(zhuǎn)換編碼是程序員的責(zé)任), 編譯的時(shí)侯是直接保存你輸入的編碼的數(shù)據(jù)(當(dāng)然你也可以指定Unicode進(jìn)行編譯時(shí)轉(zhuǎn)換成Unicode ).
            2008-12-11 13:38 | jmchxy

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            我寫的:“字符串是什么?這在C++的眼里,只不過是一片連續(xù)的內(nèi)存,且這片內(nèi)存可以跨任何平臺(tái)”,我真的找不到比這更優(yōu)美的闡述了,哪里有錯(cuò)呢?
            ---------------------------------------
            你說的是c-style string,而不是C++ string,在C++這種OO語言里,字符串是一種類型而不是一塊內(nèi)存(雖然是封裝起來的)。而std:string本身只支持ansi,對(duì)于其他編碼是不支持的。另外對(duì)于多字節(jié)的編碼來說,根本就不能跨平臺(tái),最簡(jiǎn)單的就是大小端問題,如果你做過跨平臺(tái)的網(wǎng)絡(luò)程序,應(yīng)該知道這點(diǎn)。國際標(biāo)準(zhǔn)不代表每個(gè)平臺(tái)的實(shí)現(xiàn)都是一樣的,假設(shè)在intel CPU下的“我”占兩字節(jié)編碼是E1 E2,而在另外個(gè)CPU上因?yàn)榇笮《藛栴},應(yīng)該表示成E2 E1才對(duì)。表示出來是一樣,但是內(nèi)在的數(shù)據(jù)卻變化了。所以你提出的兩個(gè)觀點(diǎn)根本站不住腳。
            2008-12-12 09:20 | guest

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            寫程序的不應(yīng)該有語言歧視,從stl到boost,C++的發(fā)展傾向于GP,而不是OOP,在OO上,C#,JAVA等都做得比C++要好。即使是做網(wǎng)頁腳本的Javascript也有很多優(yōu)美的地方,例如prototype,閉包,高階等。javascript一個(gè)prototype就可以實(shí)現(xiàn)繼承,名字空間,私有等,簡(jiǎn)潔而優(yōu)美。

            每種語言都有自己的定位,做好自己的本分就好。
            2008-12-12 09:26 | guest

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            Java其實(shí)真的很差,C++才是王道
            2008-12-12 11:08 | 不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @guest
            1、關(guān)于c-style string,還是C++ string,拜托,都什么層次的人了,跟我講這些干什么,難道我不知道?。我不寫你寫出來的那些,是因?yàn)槲矣X得那不值一提,你把我當(dāng)學(xué)生哥不成?
            2、CPU大頭,小頭?拜托,難道以為我連這都不知道?你又把我當(dāng)學(xué)生哥不成?字符編碼是二進(jìn)制級(jí)別的規(guī)范,換句話說是硬件上的規(guī)范,這可不是邏輯上的10進(jìn)制規(guī)范,哪里有大頭小頭的問題,int,long,doulbe這種東西才會(huì)不能跨平臺(tái),因?yàn)闆]有ISO標(biāo)準(zhǔn)。你想想XML能跨平臺(tái)不?能,XML是什么?一片連續(xù)的字符編碼內(nèi)存。
            3、你需要更深入的學(xué)習(xí),另外不能拿點(diǎn)皮毛當(dāng)老師,最好不要寫java了,因?yàn)樗屇愠龀罅恕?
            2008-12-12 11:29 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            英語好還是漢語好?
            2008-12-12 12:50 | abettor

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            Java就是一角本語言,也好意思出來晃

            Java看起來好象非常強(qiáng)大,什么都能干了

            實(shí)際做項(xiàng)目的時(shí)候,除了javascript,別的什么也干不了(局陷性太大),就是一大忽悠
            2008-12-12 12:58 | 不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @不懂
            呵呵 這位兄弟連java和javascript根本就是兩回事都不知道,果然是不懂。
            2008-12-12 22:30 | 你真的是不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            你的意思只不過是大家準(zhǔn)守共同的標(biāo)準(zhǔn)罷了,char *是C++所提倡的字符串嘛?我的意思是嚴(yán)格的C++字符串只是string/wstring而已,這個(gè)本身也涉及編碼問題。

            我主要是寫C/C++程序,但是最近一個(gè)項(xiàng)目是監(jiān)控下位機(jī)的,用了JAVA,就是比C++快啊!

            看過singularity這個(gè)操作系統(tǒng)嗎?驅(qū)動(dòng),IO,文件系統(tǒng),線程調(diào)度都是用C#實(shí)現(xiàn)的,剩余的OS引導(dǎo)和一小部分HAL才是用C和ASM寫的。倘若硬件直接支持C#或者JAVA的字節(jié)碼,那和C/C++/ASM就沒什么區(qū)別了,而且現(xiàn)在intel,sun等也開始著手這方面的事宜。

            C++都快成了YY語言了。
            2008-12-12 22:42 | guest

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @guest
            char*,string這種社會(huì)主義初級(jí)階段的概念,就不必討論了。這里不是CSDN,討論這個(gè)有點(diǎn)臉紅。

            從你的回復(fù)里面,我想指出一下幾個(gè)問題:
            1、java是解釋語言(JVM vs 字節(jié)碼),它的速度低于編譯型語言,這個(gè)是死理,沒誰敢否認(rèn)。我的經(jīng)驗(yàn)是速度能達(dá)到C++的10%就很不錯(cuò)了;

            2、有IO的程序,測(cè)速度那是扯談
            for(int i = 0; i < MAX_INT; ++i)printf("%d\n", i);
            上面這行代碼,你幾個(gè)小時(shí)也執(zhí)行不完成(去掉printf毫秒完成),因?yàn)樾枰狪O到屏幕上,任何IO都是慢東西,CPU在等它,所以這時(shí)瓶頸就來了,卡在了最窄的地方。同樣的道理,你那個(gè)監(jiān)測(cè)什么上位機(jī),效率瓶頸在IO,只要CPU沒有達(dá)到100%,用任何語言都沒有效率差別。測(cè)語言的效率,必須要沒有IO且CPU 100%才有意義;

            3、硬件直接支持C#或者JAVA的字節(jié)碼,這個(gè)不夠確切。應(yīng)該是java, C#本地化或者h(yuǎn)ardware JVM。
            CPU接受二進(jìn)制指令,字節(jié)碼也是二進(jìn)制指令,怎么說不支持?應(yīng)該是不兼容,因?yàn)镴VM與X86的指令集不同,JVM更高階,擁有更多指令,但是他們是同質(zhì)的,只不過一個(gè)是硬件一個(gè)是軟件虛擬;
            java提高效率的途徑,有2條路,不過我看來,2條路都比較飄渺
            可以本地化,這個(gè)當(dāng)然不現(xiàn)實(shí),因?yàn)閖ava的最大支柱就是號(hào)稱的跨平臺(tái),不能失去JVM,注定不能從解釋語言變成編譯語言,此路不通。
            可以讓X86 CPU支持JVM指令集,這當(dāng)然更是扯談了,SUN就喜歡忽悠愣頭青。不過一個(gè)可能的方向是hardware JVM的出現(xiàn),這個(gè)是可能的,但是做這個(gè)也是傻子,因?yàn)閖ava注定沒落,除非哪個(gè)巨無霸比如IBM,像MS扛C#一樣,往死里頂java,把硬件也上了。

            4、看過singularity這個(gè)操作系統(tǒng)嗎?
            這世界垃圾的軟件和技術(shù)很多,沒必要個(gè)個(gè)都知道吧
            2008-12-13 00:15 | 我也寫java

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            回:你真的是不懂

            看來你還是在念書啊,只討論純JAVA的東西。
            在實(shí)際的項(xiàng)目中,有這樣的嗎?和Java有關(guān)的技術(shù)你一概不用?說Java難道對(duì)于你就只有Java語言?

            實(shí)際的工程環(huán)境中Java相關(guān)的東西能完成的工作和MS的完全不是一個(gè)層次的。
            2008-12-13 13:12 | 不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            我主要是寫C/C++程序,但是最近一個(gè)項(xiàng)目是監(jiān)控下位機(jī)的,用了JAVA,就是比C++快啊!

            這一句太搞笑了,哈哈
            2008-12-13 23:17 | 不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            回:最后聲明一下,作為C++程序員,我永遠(yuǎn)不否認(rèn)C++是最優(yōu)秀的語言之一,在特定的場(chǎng)合下,他甚至是你唯一的選擇。但是,只有最適合的才是最好的。我們不能想象,現(xiàn)在還有誰會(huì)去用C++寫的CGI去構(gòu)建一個(gè)大型的網(wǎng)站或企業(yè)級(jí)應(yīng)用系統(tǒng)(雖然技術(shù)上是可行的);我們也難以相信,有人會(huì)去試圖用Java或PHP去實(shí)現(xiàn)一個(gè)類似OOo的桌面軟件(雖然技術(shù)上是可行的)。


            看一下:http://www.shnenglu.com/lylrabbit/archive/2008/12/12/69257.html,你會(huì)發(fā)現(xiàn)C++其實(shí)可以的
            2008-12-13 23:23 | 不懂

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            樓主并不沒有真正掌握C++或java。
            2008-12-26 16:31 | bati

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            跟貼的小鳥挺多的,呵呵。
            C++的string就不是一個(gè)類型,是個(gè)納入的C++標(biāo)準(zhǔn)擴(kuò)展類而已,并沒有進(jìn)入核心類型。

            另外string是一個(gè)模板的實(shí)現(xiàn)(basic_string<char>),理論上你可以靜態(tài)重載模板參數(shù)來使用任何字符集

            UNICODE: wstring basic_string<wchar_t>;

            字符編碼當(dāng)然是個(gè)標(biāo)準(zhǔn),并不存在平臺(tái)的不同,否則就不是標(biāo)準(zhǔn)。
            至于高低字節(jié)順序的問題,那應(yīng)該有程序轉(zhuǎn)載文件是做轉(zhuǎn)換,不是說文件內(nèi)編碼順序不一樣
            2009-03-30 22:06 | llbird

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            "相差實(shí)在太遠(yuǎn)了"是什么意思?不會(huì)用指針嗎,或者不會(huì)delete嗎?其實(shí)什么語言都看在誰手里用.不用說誰也知道java沒有c++這種本地方法快,但優(yōu)點(diǎn)也是顯然的,不要說"快餐"不好,很多人寫的c++還不一定有java效率高呢,而且c++很容易泄漏內(nèi)存.其實(shí)真正的會(huì)為自己所用才是好的,開發(fā)上層應(yīng)用java肯定是不錯(cuò)的選擇,而底層操作比較多當(dāng)然選擇c++方便.
            2011-04-03 13:05 | bluemei

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            "相差實(shí)在太遠(yuǎn)了"是什么意思?不會(huì)用指針嗎,或者不會(huì)delete嗎?其實(shí)什么語言都看在誰手里用.不用說誰也知道java沒有c++這種本地方法快,但優(yōu)點(diǎn)也是顯然的,不要說"快餐"不好,很多人寫的c++還不一定有java效率高呢,而且c++很容易泄漏內(nèi)存.其實(shí)真正的會(huì)為自己所用才是好的,開發(fā)上層應(yīng)用java肯定是不錯(cuò)的選擇,而底層操作比較多當(dāng)然選擇c++方便
            2011-04-03 13:07 | bluemei

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            "這片內(nèi)存可以跨任何平臺(tái)",c++的程序員都應(yīng)該知道(這確實(shí)比很多java人知道多一點(diǎn)),首先操作系統(tǒng)就有高低位的不一樣,然后還有字節(jié)值意義的不同(如換行符等),最重要的是,就是能正確的拷貝這塊內(nèi)存到其它平臺(tái),也是需要把這個(gè)字節(jié)數(shù)組顯示出來,如果本來是中文的卻按一個(gè)一個(gè)字節(jié)顯示那不亂碼了,編碼是很重要滴,因?yàn)槭澜缯Z言太多了.
            2011-04-03 13:25 | bluemei

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            @我也寫java
            "字符編碼是二進(jìn)制級(jí)別的規(guī)范,換句話說是硬件上的規(guī)范,這可不是邏輯上的10進(jìn)制規(guī)范,哪里有大頭小頭的問題",不是這樣子的吧,一樣的編碼在存儲(chǔ)時(shí)高低字節(jié)也可能是不一樣的,由FEFF和FFFE來標(biāo)志;在網(wǎng)絡(luò)傳輸時(shí)高低字節(jié)的發(fā)送順序也不一定一樣.既然不一樣就存在"大頭小頭"問題
            2011-04-03 14:25 | bluemei

            # re: 從Java到C++ — 對(duì)比Java與C++編程的不同  回復(fù)  更多評(píng)論   

            一群sx,討論這個(gè)有意義嗎?某些C++程序員就會(huì)吹,神話一門程序語言,貶低一門語言。說效率,你怎么不去寫匯編啊,能干的事更多。吹c++的我看都是個(gè)人英雄主義作祟。本來就是各有各的好,合適的地方用合適的東西。把java貶的一文不值是什么心理?java能量產(chǎn)程序員,更好的工業(yè)化軟件開發(fā),更快的開發(fā)出客戶想要的產(chǎn)品,而且使產(chǎn)品更穩(wěn)定。
            2013-08-21 17:24 | 吹吹吹
            国产成人久久精品二区三区| 波多野结衣久久一区二区| 久久国产精品免费一区二区三区 | 99久久精品国产综合一区 | 久久av高潮av无码av喷吹| 久久天天躁狠狠躁夜夜2020一| 丁香久久婷婷国产午夜视频| 亚洲精品无码久久不卡| 午夜精品久久久久成人| 午夜视频久久久久一区 | 国产A三级久久精品| 久久久亚洲欧洲日产国码是AV| 国产精品久久久福利| 久久香蕉综合色一综合色88| 亚洲欧美日韩精品久久| 国产毛片欧美毛片久久久| 91精品日韩人妻无码久久不卡| 久久精品一区二区三区AV| 激情五月综合综合久久69| 国产综合久久久久| 国产女人aaa级久久久级| 国产精品久久久久久吹潮| 久久久久久久精品成人热色戒| 久久精品成人欧美大片| 国产69精品久久久久APP下载| 伊人丁香狠狠色综合久久| 久久亚洲美女精品国产精品| 国产精品一久久香蕉国产线看观看 | 久久综合九色综合久99| 亚洲AV成人无码久久精品老人| 久久人爽人人爽人人片AV| 久久受www免费人成_看片中文 | 99久久er这里只有精品18| 婷婷综合久久中文字幕蜜桃三电影 | 久久精品国产一区| 日韩欧美亚洲综合久久影院Ds| 国产精品VIDEOSSEX久久发布| 91秦先生久久久久久久| 精品久久久久久中文字幕| 青青热久久综合网伊人| 亚洲一区二区三区日本久久九|