• <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, 評論 - 64, 引用 - 0
            數據加載中……

            從Java到C++ — 對比Java與C++編程的不同

            1. 數據類型和變量

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

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

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

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

            1. C++ 字符串存儲ASCII 碼字符,而不是標準碼Unicode 字符

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

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

            4. 在C++中,你只能夠將字符串與其它字符串對象相串聯(concatenate),而不能夠與任意的對象相串聯。

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



            2. 變量和常量

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

            int n = 5;

            實際上這正是C++和Java的一個重要不同之處。C++編譯器不對本地變量進行初始化檢驗,所以在C++中很容易忘記初始化一個變量,這種情況下,變量的值該變量所占內存區域中剛好當前存在隨機值。這顯然是很容易產生程序出錯的地方。

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

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

            const int DAYS_PER_YEAR = 365;




            3. 類

            C++ 中對類的定義與Java有些不同,這里是一個例子:一個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;

            };

            這里幾點重要的不同是:

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

            2. C++中類的定義只包含函數的聲明,真正的實現另外單獨列出。

            3. 訪問函數(accessor methods)標有關鍵字 const ,表明這個函數不會改變本對象的元素值。

            4. 類定義的結尾處有分號

            類中函數的實現跟在類的定義之后。因為函數是在類外面定義的,所以每一個函數的名字前面要加類名稱作為前綴,并使用操作符雙冒號::來分割類的名稱和函數的名稱。不改變隱含參數值(即當前對象的值)的訪問函數用 const標明。如下所示是上面類定義中的函數的實現:

            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. 對象

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

            Point p(1, 2); /* 構造對象 p */

            如果不跟參數賦值,則使用默認構造函數,例如:

            Time now; /* 默認使用構造函數 Time::Time() */

            這一點與Java很不同。在Java中,這個命令僅僅生成一個沒有初始化的reference,而在C++中,它生成一個實際的對象。

            當一個對象被賦給另一個對象變量的時候,實際的值將被拷貝。而在Java中,拷貝一個對象變量只不過是建立了另外一個指向對象的reference。拷貝一個C++的對象就像在Java中調用clone這個函數一樣,而修改拷貝的值不會改變原對象的值。例如:

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

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

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

            1. 當需要一個函數中修改一個對象的值,必須記住要使用按引用調用call by reference (參見下面函數部分)

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

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

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






            5. 函數

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

            特別的是,每一個C++ 程序都從一個叫做 main的全局函數開始執行:

            int main()

            { . . .

            }

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

            按照習慣,通常如果程序執行成功, main 函數返回0,否則返回非零整數。

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

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

            void raiseSalary(Employee& e, double by)

            { . . .

            }

            下面是一個典型的利用call by reference的函數,在Java中是無法實現這樣的功能的。

            void swap(int& a, int& b)

            { int temp = a;

            a = b;

            b = temp;

            }

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

            在 C++中,每當需要實現修改原參數的值時你就可以使用按地址調用 call by reference




            6. 向量Vector

            C++ 的向量結構結合了Java中數組和向量兩者的優點。一個C++ 的向量可以方便的被訪問,其容量又可以動態的增長。如果 T 是任意類型,則 vector<T> 是一個元素為 T 類型的動態數組。下面的語句

            vector<int> a;

            產生一個初始為空的向量。而語句

            vector<int> a(100);

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

            a.push_back(n);

            調用 a.pop_back()a中取出最后一個元素(操作后這個元素被從a中刪掉), 使用函數size 可以得到當前a中的元素個數。

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

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

            sum = sum + a[i];

            }

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

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

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

            對比Java中的情況,在Java中,一個數組變量是一個指向數組的reference。拷貝這個變量僅僅產生另外一個指向同一數組的reference,而不會拷貝每一個元素的值。

            正因如此,如果一個C++函數要實現修改向量的值,必須使用reference參數:

            void sort(vector<int>& a)

            { . . .

            }




            7. 輸入和輸出

            在C++中,標準的輸入輸出流用對象 cincout 表示。我們使用 << 操作符寫輸出,例如:

            cout << “Hello, World!”;

            也可以連著輸出多項內容,例如:

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

            我們使用 >> 操作符來讀入一個數字或單詞,例如:

            double x;

            cout << “Please enter x: “;

            cin >> x;

            string fname;

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

            cin >> fname;

            函數getline 可以讀入整行的輸入,例如:

            string inputLine;

            getline(cin, inputLine);

            如果到達輸入的結尾,或者一個數字無法被正確的讀入,這個流對象會被設置為 failed 狀態,我們可以使用函數 fail 來檢驗這個狀態,例如:

            int n;

            cin >> n;

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

            一旦一個流的狀態被設為failed,我們是很難重置它的狀態的,所以如果你的程序需要處理錯誤輸入的情況,應該使用函數 getline 然后人工處理得到的輸入數據。

             

             



            8. 指針pointer

            我們已經知道在C++中,對象變量直接存儲的是對象的值。這是與Java不同的,在Java中對象變量存儲的是一個地址,該地址指向對象值實際存儲的地方。有時在C++中也需要實現這樣的布置,這就用到了指針pointer。在 C++中,一個指向對象的變量叫做指針。如果T是一種數據類型,則 T* 是指向這種數據類型的指針。

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

            Employee* p = NULL;

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

            Employee* r = q;

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

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

            Employee* s = &boss;

            這實際上并不是什么好主意。保險的做法還是應該直接讓指針指向使用 new生成的新對象。

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

            Employee* p = . . .;

            Employee boss = *p;

            當我們需要執行對象的函數或訪問對象的一個數據域時,也需要使用 *p

            (*p).setSalary(91000);

            *p外面的括號是必需的,因為 . 操作符比 * 操作符有更高的優先級。C的設計者覺得這種寫法很難看,所以他們提供了另外一種替代的寫法,使用 -> 操作符來實現 *. 操作符的組合功能。表達式

            p->setSalary(91000);

            可以調用對象*p的函數 setSalary 。你可以簡單的記住 . 操作符是在對象上使用的,-> 操作符是在指針上使用的。

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

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

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

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

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

            . . .

            delete p; /* 不在需要這個對象 */

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




            9. 繼承

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

            默認情況下,C++中的函數不是動態綁定的。如果你需要某個函數實現動態綁定,需要使用virtual聲明它為虛函數,例如:

            class Manager : public Employee

            {

            public:

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

            virtual void print() const;

            private:

            string department;

            };

            同Java一樣,構造函數中調用父類的構造函數有特殊的語法。 Java使用關鍵字 super。C++中必須在子類的構造函數體外調用父類的構造函數。下面是一個例子:

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

            : Employee(name, salary) /* 調用父類的構造函數 */

            { department = dept;

            }

            Java 中在子類函數中調用父類的函數時也使用關鍵字 super 。而在C++中是使用父類的名稱加上操作符 ::表示,例如:

            void Manager::print() const

            { Employee::print(); /* 調用父類的函數 */

            cout << department << “\n”;

            }

            一個 C++ 對象變量只能存儲特定類型的對象值。要想在C++中實現多態(polymorphism),必須使用指針。一個 T* 指針可以指向類型為 TT 的任意子類的對象,例如:

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

            你可以將父類和不同子類的對象混合收集到一個元素均為指針的向量中,然后調用動態綁定的函數,如下所示:

            vector<Employee*> staff;

            . . .

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

            staff[i]->print();

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

            評論

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            1. C++ 字符串存儲ASCII 碼字符,而不是標準碼Unicode 字符

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            JAVA寫多了,能力會退化的。
            我以前寫了6年的C++。然后寫了一年的JAVA,再回頭寫C++,發現代碼的效率啊,代碼的結構,思考的方法等,都退化了。。
            2008-12-09 16:51 | 絕對零度

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            力挺c++
            2008-12-09 21:14 | 一小步一大步網

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            @abettor
            如果你的C++很強的話,你真的會鄙視java,也不屑于寫java代碼。
            CGI?不用這個,因為我們的http server是用C++自己寫的,參考了lighttpd,能實現任何功能,當然是我們需要的一些功能.
            2008-12-10 10:57 | 我也寫java

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            對字符串預編碼有時侯是很郁悶的事情.

            D語言在這個方面的設計就讓人很XX. 賦值的字符串直接輸出全部是亂碼, 轉來轉去的很煩. 還記得當初java的Unicode編碼的轉換問題嗎?

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            @guest
            1、關于c-style string,還是C++ string,拜托,都什么層次的人了,跟我講這些干什么,難道我不知道?。我不寫你寫出來的那些,是因為我覺得那不值一提,你把我當學生哥不成?
            2、CPU大頭,小頭?拜托,難道以為我連這都不知道?你又把我當學生哥不成?字符編碼是二進制級別的規范,換句話說是硬件上的規范,這可不是邏輯上的10進制規范,哪里有大頭小頭的問題,int,long,doulbe這種東西才會不能跨平臺,因為沒有ISO標準。你想想XML能跨平臺不?能,XML是什么?一片連續的字符編碼內存。
            3、你需要更深入的學習,另外不能拿點皮毛當老師,最好不要寫java了,因為它讓你出丑了。
            2008-12-12 11:29 | 我也寫java

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            Java看起來好象非常強大,什么都能干了

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            我主要是寫C/C++程序,但是最近一個項目是監控下位機的,用了JAVA,就是比C++快??!

            看過singularity這個操作系統嗎?驅動,IO,文件系統,線程調度都是用C#實現的,剩余的OS引導和一小部分HAL才是用C和ASM寫的。倘若硬件直接支持C#或者JAVA的字節碼,那和C/C++/ASM就沒什么區別了,而且現在intel,sun等也開始著手這方面的事宜。

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            @guest
            char*,string這種社會主義初級階段的概念,就不必討論了。這里不是CSDN,討論這個有點臉紅。

            從你的回復里面,我想指出一下幾個問題:
            1、java是解釋語言(JVM vs 字節碼),它的速度低于編譯型語言,這個是死理,沒誰敢否認。我的經驗是速度能達到C++的10%就很不錯了;

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

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

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            回:你真的是不懂

            看來你還是在念書啊,只討論純JAVA的東西。
            在實際的項目中,有這樣的嗎?和Java有關的技術你一概不用?說Java難道對于你就只有Java語言?

            實際的工程環境中Java相關的東西能完成的工作和MS的完全不是一個層次的。
            2008-12-13 13:12 | 不懂

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            我主要是寫C/C++程序,但是最近一個項目是監控下位機的,用了JAVA,就是比C++快??!

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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


            看一下:http://www.shnenglu.com/lylrabbit/archive/2008/12/12/69257.html,你會發現C++其實可以的
            2008-12-13 23:23 | 不懂

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            跟貼的小鳥挺多的,呵呵。
            C++的string就不是一個類型,是個納入的C++標準擴展類而已,并沒有進入核心類型。

            另外string是一個模板的實現(basic_string<char>),理論上你可以靜態重載模板參數來使用任何字符集

            UNICODE: wstring basic_string<wchar_t>;

            字符編碼當然是個標準,并不存在平臺的不同,否則就不是標準。
            至于高低字節順序的問題,那應該有程序轉載文件是做轉換,不是說文件內編碼順序不一樣
            2009-03-30 22:06 | llbird

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

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

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            @我也寫java
            "字符編碼是二進制級別的規范,換句話說是硬件上的規范,這可不是邏輯上的10進制規范,哪里有大頭小頭的問題",不是這樣子的吧,一樣的編碼在存儲時高低字節也可能是不一樣的,由FEFF和FFFE來標志;在網絡傳輸時高低字節的發送順序也不一定一樣.既然不一樣就存在"大頭小頭"問題
            2011-04-03 14:25 | bluemei

            # re: 從Java到C++ — 對比Java與C++編程的不同  回復  更多評論   

            一群sx,討論這個有意義嗎?某些C++程序員就會吹,神話一門程序語言,貶低一門語言。說效率,你怎么不去寫匯編啊,能干的事更多。吹c++的我看都是個人英雄主義作祟。本來就是各有各的好,合適的地方用合適的東西。把java貶的一文不值是什么心理?java能量產程序員,更好的工業化軟件開發,更快的開發出客戶想要的產品,而且使產品更穩定。
            2013-08-21 17:24 | 吹吹吹
            久久久久久精品无码人妻| 人妻少妇精品久久| 久久精品国产影库免费看 | 亚洲国产精品久久久久| 激情综合色综合久久综合| 久久国内免费视频| 久久r热这里有精品视频| 伊人久久国产免费观看视频 | 婷婷久久五月天| 久久国产色AV免费观看| 青青热久久国产久精品| 丰满少妇高潮惨叫久久久| 亚洲精品无码久久毛片| 91久久精一区二区三区大全| 激情综合色综合久久综合| 久久国产热精品波多野结衣AV| 久久久久九国产精品| 精品久久久久久久无码| 中文字幕乱码久久午夜| 久久天天躁狠狠躁夜夜不卡 | 国产情侣久久久久aⅴ免费| 久久中文字幕视频、最近更新| 久久99国产精一区二区三区| 久久人做人爽一区二区三区| 国産精品久久久久久久| 一本伊大人香蕉久久网手机| 天天爽天天狠久久久综合麻豆| 一本久久精品一区二区| 欧洲性大片xxxxx久久久| 伊人色综合久久天天| 久久综合综合久久97色| 国产精品99久久精品| 热re99久久精品国99热| 亚洲国产欧洲综合997久久| 国产精品久久婷婷六月丁香| 婷婷久久五月天| 2020国产成人久久精品| 国产69精品久久久久久人妻精品| 亚洲国产成人精品无码久久久久久综合| 99精品久久久久久久婷婷| 国产精品无码久久久久|