1. 數(shù)據(jù)類型與變量
C++中布爾類型是bool蚣抗,字符串類型是string
需要注意的點
string 都是 ASCII, 而不是unicode
C++中string可以被修改侈百,而Java不能
substr獲取字字符串,
s.substr(i, n)
從i開始翰铡,截取n長可以直接使用
== != < <= > >=
比較字符串
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;
};
有以下幾點不同:
- 在c++中织咧,有public和private兩個塊胀葱,而在java中用public和private關鍵詞修飾
- c++類定義只有定義和方法,和初始化的代碼是分開的
- accessor方法被標記為const(java get方法)
- 類結尾有分號
方法實現(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 */
相比下蚜锨,這些情況都需要使用指針:
- 修改一個對象的時候
- 如果需要兩個變量指向同一個對象
- 類變量只能是一個基礎類型,如果要指向對象郭膛,用指針
- 如果需要指向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的字類。