青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 30, 文章 - 0, 評論 - 64, 引用 - 0
數(shù)據(jù)加載中……

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

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

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

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

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

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

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

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

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

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

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



2. 變量和常量

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

int n = 5;

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

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

在C++中,常量可以在任何地方被定義(記得在Java中,常量必須是類的靜態(tài)數(shù)據(jù)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++中類的定義只包含函數(shù)的聲明,真正的實現(xiàn)另外單獨列出。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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






5. 函數(shù)

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

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

int main()

{ . . .

}

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

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

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

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

void raiseSalary(Employee& e, double by)

{ . . .

}

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

void swap(int& a, int& b)

{ int temp = a;

a = b;

b = temp;

}

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

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




6. 向量Vector

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

vector<int> a;

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

vector<int> a(100);

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

a.push_back(n);

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

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

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

sum = sum + a[i];

}

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

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

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

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

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

void sort(vector<int>& a)

{ . . .

}




7. 輸入和輸出

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

cout << “Hello, World!”;

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

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

我們使用 >> 操作符來讀入一個數(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);

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

int n;

cin >> n;

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

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

 

 



8. 指針pointer

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

就像 Java中一樣,一個指針變量可以被初始化為空值 NULL,另外一個指針變量的值,或者一個調(diào)用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;

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

(*p).setSalary(91000);

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

p->setSalary(91000);

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

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

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

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

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

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

. . .

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

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




9. 繼承

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

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

class Manager : public Employee

{

public:

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

virtual void print() const;

private:

string department;

};

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

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

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

{ department = dept;

}

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

void Manager::print() const

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

cout << department << “\n”;

}

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

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

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

vector<Employee*> staff;

. . .

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

staff[i]->print();

posted on 2008-12-09 13:43 henry08 閱讀(4317) 評論(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字符串的內(nèi)容是不可修改的(immutable)。
========================
字符串是什么?這在C++的眼里,只不過是一片連續(xù)的內(nèi)存,且這片內(nèi)存可以跨任何平臺;在java眼里,是ASICC,UTF-8,UTF-16這種編碼構成的某種神秘物體。
這就是差別,叫差距行不行?我看行。
2008-12-09 16:39 | 我也寫java

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

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

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

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

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

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

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

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

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

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

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

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

你沒發(fā)現(xiàn)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,能實現(xiàn)任何功能,當然是我們需要的一些功能.
2008-12-10 10:57 | 我也寫java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

每種語言都有自己的定位,做好自己的本分就好。
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大頭,小頭?拜托,難道以為我連這都不知道?你又把我當學生哥不成?字符編碼是二進制級別的規(guī)范,換句話說是硬件上的規(guī)范,這可不是邏輯上的10進制規(guī)范,哪里有大頭小頭的問題,int,long,doulbe這種東西才會不能跨平臺,因為沒有ISO標準。你想想XML能跨平臺不?能,XML是什么?一片連續(xù)的字符編碼內(nèi)存。
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++程序,但是最近一個項目是監(jiān)控下位機的,用了JAVA,就是比C++快啊!

看過singularity這個操作系統(tǒng)嗎?驅(qū)動,IO,文件系統(tǒng),線程調(diào)度都是用C#實現(xiàn)的,剩余的OS引導和一小部分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++ — 對比Java與C++編程的不同  回復  更多評論   

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

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

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

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

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

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

回:你真的是不懂

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

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

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

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

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

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

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


看一下:http://m.shnenglu.com/lylrabbit/archive/2008/12/12/69257.html,你會發(fā)現(xiàn)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是一個模板的實現(xiàn)(basic_string<char>),理論上你可以靜態(tài)重載模板參數(shù)來使用任何字符集

UNICODE: wstring basic_string<wchar_t>;

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

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

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

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

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

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

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

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

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

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

一群sx,討論這個有意義嗎?某些C++程序員就會吹,神話一門程序語言,貶低一門語言。說效率,你怎么不去寫匯編啊,能干的事更多。吹c++的我看都是個人英雄主義作祟。本來就是各有各的好,合適的地方用合適的東西。把java貶的一文不值是什么心理?java能量產(chǎn)程序員,更好的工業(yè)化軟件開發(fā),更快的開發(fā)出客戶想要的產(chǎn)品,而且使產(chǎn)品更穩(wěn)定。
2013-08-21 17:24 | 吹吹吹
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线观看视频一区| 亚洲激情电影在线| 国产伦理精品不卡| 欧美午夜精品久久久久久孕妇| 亚洲四色影视在线观看| 久久婷婷久久| 一区二区三区欧美在线| 国产日韩欧美综合在线| 国产日韩欧美在线播放| 国产精品日韩在线| 国产精品二区三区四区| 欧美高清在线| 欧美视频国产精品| 欧美成年人视频| 欧美一级淫片aaaaaaa视频| 亚洲女人天堂av| 99视频+国产日韩欧美| 亚洲精品一区二区三区av| 亚洲国产精品成人综合| 久久精品国产久精国产思思| 亚洲国产mv| 免费短视频成人日韩| 免费永久网站黄欧美| 欧美国产日韩一区二区| 久久精品中文字幕一区| 久久中文久久字幕| 午夜精品亚洲| 久久这里有精品15一区二区三区| 久久精品人人做人人综合| 欧美成人午夜免费视在线看片| 欧美亚洲综合在线| 久久精品夜夜夜夜久久| 国产精品久久久久7777婷婷| 理论片一区二区在线| 欧美成人性生活| 香蕉av777xxx色综合一区| 欧美在线地址| 亚洲人成人99网站| 久久精品理论片| 亚洲欧洲在线看| 欧美综合国产| 国产精品爽爽爽| aa亚洲婷婷| 美日韩丰满少妇在线观看| 久久久久久久综合色一本| 国产精品久久久久久久久 | 亚洲一二三四区| 久久婷婷丁香| 亚洲免费在线视频| 欧美日本在线观看| 在线看国产一区| 欧美aaaaaaaa牛牛影院| 亚洲欧美综合精品久久成人| 伊人狠狠色丁香综合尤物| 欧美一区二区在线免费观看 | 国产亚洲一区二区三区在线观看 | 91久久国产自产拍夜夜嗨| 麻豆乱码国产一区二区三区| 国产精品盗摄久久久| 欧美激情国产日韩| 国产精品亚洲欧美| 久久久久久电影| 久久国产日韩欧美| 亚洲午夜在线观看| 国产美女诱惑一区二区| 嫩草成人www欧美| 欧美福利一区二区| 亚洲卡通欧美制服中文| 亚洲高清免费视频| 激情另类综合| 日韩亚洲欧美成人一区| 国内精品免费午夜毛片| 欧美高清在线视频观看不卡| 免费精品视频| 欧美一区二区三区四区在线| 久久gogo国模裸体人体| 日韩视频在线观看免费| 欧美一区二区三区视频免费| 亚洲尤物视频在线| 老司机午夜免费精品视频| 欧美一区中文字幕| 久久综合网色—综合色88| 亚洲国产成人久久| 极品日韩久久| 欧美一级久久久| 亚洲一区影音先锋| 国模私拍视频一区| 午夜精品福利一区二区蜜股av| 99re6热在线精品视频播放速度| 亚洲欧美综合精品久久成人| 亚洲人成人一区二区三区| 欧美成人免费在线观看| 麻豆精品在线视频| 在线精品亚洲| 久热爱精品视频线路一| 日韩视频在线免费观看| 国内精品亚洲| 亚洲欧美国产精品桃花| 久久午夜电影网| 国产真实乱子伦精品视频| 亚洲尤物在线| 欧美日韩国产在线播放网站| 亚洲小视频在线观看| 久久婷婷国产综合国色天香| 亚洲夫妻自拍| 欧美美女操人视频| 亚洲欧美卡通另类91av| 欧美/亚洲一区| 亚洲人成在线观看一区二区| 欧美激情无毛| 久久久久女教师免费一区| 最新高清无码专区| 在线视频精品| 国产偷久久久精品专区| 国产一区二区三区奇米久涩| 免费日韩精品中文字幕视频在线| 亚洲毛片av在线| 久久久久88色偷偷免费| 欧美成人精品1314www| 一本久久综合亚洲鲁鲁| 日韩天天综合| 久久在线免费| 中国女人久久久| 亚洲精品久久久久久久久久久久| 久热re这里精品视频在线6| 欧美伊久线香蕉线新在线| 午夜激情一区| 久久亚洲不卡| 欧美国产视频在线观看| 欧美成人国产va精品日本一级| 免费日韩视频| 亚洲美女在线观看| 亚洲欧美久久久| 免费日韩av| 国产欧美一区二区三区视频| 国产精品亚洲综合色区韩国| 激情综合久久| 毛片一区二区| 噜噜噜在线观看免费视频日韩| 国产精品一区二区在线观看不卡| 亚洲精品日韩在线观看| 久久在线免费观看| 亚洲精品国产精品乱码不99 | 亚洲一区免费在线观看| 国产一区视频在线看| 国产精品福利网| 好吊色欧美一区二区三区视频| 精品999久久久| 久久成人免费日本黄色| 六月婷婷一区| 欧美日韩中字| 亚洲精品美女久久久久| 久久人人爽人人爽| 欧美~级网站不卡| 亚洲无毛电影| 欧美日韩在线三区| 亚洲国产影院| 国语自产在线不卡| 亚洲女人小视频在线观看| 亚洲缚视频在线观看| 久久精品导航| 国产欧美日韩三级| 一区二区三区不卡视频在线观看| 欧美激情一级片一区二区| 久久大逼视频| 国产精品久久久久久久久久尿| 亚洲第一色中文字幕| 欧美成人69| 欧美黑人多人双交| 国产精品久久久久免费a∨大胸| 黄色综合网站| 欧美激情精品久久久久久蜜臀| 在线视频日本亚洲性| 欧美图区在线视频| 一区二区三区 在线观看视| av成人免费在线| 国产视频精品va久久久久久| 亚洲视频一区二区在线观看| 99这里只有精品| 亚洲大胆人体视频| 午夜精品视频在线| 亚洲精品影视在线观看| 一本一道久久综合狠狠老精东影业| 亚洲国内精品| 欧美成人免费全部观看天天性色| 亚洲美女视频在线观看| 欧美大片免费久久精品三p| 久久久99精品免费观看不卡| 国产精品区一区| 欧美制服丝袜| 欧美顶级少妇做爰| 一区二区三区在线免费视频 | 红杏aⅴ成人免费视频| 亚洲精品一区二区三区不| 欧美1区2区视频| 最近看过的日韩成人| 欧美第十八页| 欧美一区激情| 麻豆成人av| 一区二区三区日韩精品|