Java程序員學習C++(第一篇)

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

C++中布爾類型是bool蚣抗,字符串類型是string

需要注意的點

  1. string 都是 ASCII, 而不是unicode

  2. C++中string可以被修改侈百,而Java不能

  3. substr獲取字字符串,s.substr(i, n)從i開始翰铡,截取n長

  4. 可以直接使用 == != < <= > >= 比較字符串

2. 變量與常量

定義一個變量

int n = 5;

c++和java不同的是钝域,c++定義的變量在使用前不會去檢查是否被初始化了,所以變量指向的位置可能是一個臟的數(shù)據(jù)锭魔。

c++可以在任何地方定義靜態(tài)變量例证,但java只能在class里定義static

常量可以在任何地方定義,使用const(java final)

const int DAYS_PER_YEAR = 365;

3. 類創(chuàng)建

類的定義不同迷捧,一個c++類的形式如下

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++中织咧,有public和private兩個塊胀葱,而在java中用public和private關鍵詞修飾
  2. c++類定義只有定義和方法,和初始化的代碼是分開的
  3. accessor方法被標記為const(java get方法)
  4. 類結尾有分號

方法實現(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. 對象操作

C++類變量包含的是實際的值抵屿,new關鍵詞很少用

Point p(1, 2); // 創(chuàng)建一個p對象

如果不提供構造參數(shù),會使用默認構造函數(shù)

Time now;   // 創(chuàng)建 Time::Time()

在Java里這是一個空的指針捅位,而C++會直接創(chuàng)建一個對象

在賦值的時候轧葛,Java是創(chuàng)建了另一個指針指向同一個對象尿扯,而C++是復制衷笋,相當于Java clone.

Point q = p; /* 復制p對象 */

q.move(1, 1); /* 改變q淀散,不改變p */

相比下蚜锨,這些情況都需要使用指針:

  1. 修改一個對象的時候
  2. 如果需要兩個變量指向同一個對象
  3. 類變量只能是一個基礎類型,如果要指向對象郭膛,用指針
  4. 如果需要指向null或者一個實際的對象

5. 函數(shù)

Java里的函數(shù)只能是類實例或者靜態(tài)函數(shù)则剃,而C++可以在類外定義函數(shù)如捅,稱為全局函數(shù)

函數(shù)的傳值,Java由于是引用己肮,所以可以修改行參信息谎僻,C++是傳入的拷貝寓辱,所以不會更改行參的信息,當然C++也可以使用引用傳遞诱鞠,這樣可以完成Java不能寫出來的swap函數(shù)

void swap(int& a, int& b)

{  int temp = a;

   a = b;

   b = temp;

}

6. Vectors

C++ vector相當于Java ArrayList, 可以動態(tài)增長,如果T是一個類型肋乍,vector<T>會創(chuàng)建一個T的動態(tài)數(shù)組

vector<int> a;

創(chuàng)建了一個空vector

vector<int> a(100);

創(chuàng)建一個初始有100元素的vector

a.push_back(n);

添加可以使用push_back, 移除最后一個使用pop_back

遍歷

for (i = 0; i < a.size(); i++)
   sum = sum + a[i];

在Java中有越界檢查墓造,但C++沒有锚烦,所以需要注意邊界size

7. 輸入輸出

C++標準輸入輸出使用cin和cout

輸出

cout << "hello word!";

輸入

double x;
cin >> x;

string fname;
cin >> fname;

getline可以讀取一整行

string inputline;
getline(cin, inputline);

如果輸入到達結尾或者讀取遇到錯誤涮俄,比如讀數(shù)字,但不是數(shù)字的情況孕锄,輸入流會進入錯誤狀態(tài)苞尝,可以用fail方法檢查

int n;
cin >> n;
if (cin.fail()) cout << "Bad input";

如果流進入錯誤狀態(tài),很難重置轴脐,所以如果要處理不好的輸入大咱,應該用getline注益。

8. 指針

定義一個指針

Employee* p;
Employee* q = new Employee("loick", 90000);
Employee* r = q;

第四種,使用操作符&厦瓢,指針指向另一個對象

Employee boss("Morris, Melinda", 83000);
Employee* s = &boss;

不提倡這樣的指向旷痕,C++指針應該只指向使用new創(chuàng)建的對象顽冶。

如果p是指向Employee的指針,那么*p表示這個對象

Employee* p = . . .;
Employee boss = *p;

訪問對象成員

(*p).setSalary(91000);   // .優(yōu)先級高于*

p->setSalary(91000);        // 或者

如果指針沒有初始化绞呈,NULL,或者指向一個不存在的對象艺智,那么就會出錯圾亏,但是

C++不會檢查這些錯誤,程序會導致不可知的錯誤夭问。

另外缰趋,C++沒有自動的垃圾回收陕见,沒有使用new創(chuàng)建的對象,在作用域之外會被回收灰粮,但new出的對象使用完成后要用delete操作符

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

. . .

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

因此蜕着,在C++中盡量少使用指針

9. 繼承

C++使用 :public 而不是extend去繼承承匣,也有private锤悄,但用的很少

默認,函數(shù)是靜態(tài)綁定的袍暴,如果要動態(tài)綁定隶症,使用virtual

動態(tài)綁定可以在多態(tài)情況下,父類指針調用具體實現(xiàn)字類的方法淋样。

class Manager : public Employee

{

public:

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

   virtualvoid print() const;

private:

   string department;

};

使用父類的構造函數(shù)胁住,在類外部的構造函數(shù)中調用父類構造函數(shù)

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

: Employee(name, salary) /* call superclass constructor */

{  department = dept;

}

使用父類的方法, 用類名加上::

void Manager::print() const

{  Employee::print(); /* call superclass method */

   cout << department << "\n";

}

C++中的多態(tài),如果T*表示T或者T的字類儡司,而vector<T>就可以混合元素T以及T的字類。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跷坝,一起剝皮案震驚了整個濱河市碉碉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顿颅,老刑警劉巖足丢,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩跌,死亡現(xiàn)場離奇詭異,居然都是意外死亡柬批,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門氮帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洛姑,“玉大人,你說我怎么就攤上這事参咙。” “怎么了蕴侧?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵净宵,是天一觀的道長塘娶。 經(jīng)常有香客問我,道長刁岸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任迫横,我火速辦了婚禮矾踱,結果婚禮上疏哗,老公的妹妹穿的比我還像新娘。我一直安慰自己贝搁,他們只是感情好芽偏,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布膀哲。 她就那樣靜靜地躺著被碗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛮放。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音娩嚼,去河邊找鬼滴肿。 笑死,一個胖子當著我的面吹牛贵少,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滔灶,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼麻车!你這毒婦竟也來了动猬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赁咙,失蹤者是張志新(化名)和其女友劉穎序目,沒想到半個月后猿涨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡叛赚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溪掀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡璃哟,死狀恐怖随闪,靈堂內(nèi)的尸體忽然破棺而出骚勘,到底是詐尸還是另有隱情撮奏,我是刑警寧澤当宴,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布户矢,位于F島的核電站逗嫡,受9級特大地震影響,放射性物質發(fā)生泄漏延窜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一逆瑞、第九天 我趴在偏房一處隱蔽的房頂上張望获高。 院中可真熱鬧吻育,春花似錦、人聲如沸摊趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛炮。三九已至宝踪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粟害,已是汗流浹背颤芬。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工汰具, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留留荔,地道東北人澜倦。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像碘勉,于是被迫代替她去往敵國和親验靡。 傳聞我的和親對象是個殘疾皇子雏节,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容