接續【C語言基礎系列】ios
在進行NDK開發的時候 , 咱們使用的不少第三方庫 , 大多數都是使用的C/C++編寫的 , 有些多是C和C++混編的 。如,我在NDK系列中提到的增量更新使用的兩個庫 bsdiff
和bzip2
。那麼 , 咱們在學完C語言以後 , 有必要研究一下C++,由於C++是C的拓展 , 加入了面向對象和模板技術 ,那麼基本語法就不用介紹了。本系列假定你具備必定的編程經驗,對面向對象有必定的瞭解 。c++
在Java中 , 咱們使用包來區分文件的所在路徑和類來自哪一個包 ,使用package
來聲明文件在哪一個文件目錄下 , 進而在使用的時候能夠區分 , 來自不一樣的包的相同類名 。在C++裏面沒有package
關鍵字 , 而是使用namespace
來做爲區分 , 在PHP中也是如此 , 在PHP5.0的時候引入的了namespace
來作爲區分不一樣路徑下的同名函數和類 。編程
定義namespace函數
/* cpp namespace demo */ #include <iostream> /* 自定義命名空間 , 至關於Java中的包 。 命名空間能夠嵌套 */ namespace NSP_A { class A { public: void sayHello() { std::cout << "say Hello " << std::endl; } }; // 嵌套namespace namespace NSP_A_1 { class A { public: void sayHello() { std::cout << "Say Hello 1" << std::endl; } }; } }
使用namespacethis
// 標準命名空間 (包含不少標準的定義) using namespace std; // use namespace using namespace NSP_A; /* 使用自定義命名空間 */ void useNameSpace() { A a; a.sayHello(); // 嵌套命名空間使用 NSP_A_1::A a2; a2.sayHello(); }
在C++中也定義了一些標準命名空間 , 如std
,C++中也兼容C語言語法 , 能夠引入C語言頭文件,使用C標準函數 。spa
C++是面嚮對象語言 , 面嚮對象語言的一大特徵就是能夠將類型整合起來 , 能夠建立類型實例 。指針
建立C++類code
/* cpp class type */ #include <iostream> using namespace std; namespace CPP_CLASS { class Animal { // C++ 共用權限訪問修飾符 private: char* name; int age; public: void setName(char* name) { this->name = name; } void setAge(int age) { this->age = age; } void showInfo() { cout << "名稱:" << this->name << " 年歲:" << this->age << endl; } }; }
寫法都是相似的 , C++字段和函數都是採用的共享權限修飾符 , 值得注意的是 , 在C++中 , 結構體裏面的屬性和函數也具備權限訪問修飾符 。對象
/* CPP Struct */ namespace CPP_STRUCT { // C++結構體與C結構不一樣之處在於 , 在C++中結構體內字段函數能夠有權限修飾符,用法和類用法一致 // 和類不一樣的是 , struct 不能繼承 struct Person { private: char* name; int age; public: void setName(char* name) { this->name = name; } void setAge(int age) { this->age = age; } void showPersonInfo() { cout << "姓名: " << this->name << " 年齡: " << this->age << endl; } }; }
結構體和類最大的不一樣是 , 結構體不能繼承 , 不能進行抽象化。繼承
使用C++類 與 結構體
/* CPP Class */ using namespace CPP_CLASS; /* CPP Struct */ using namespace CPP_STRUCT; /* Simple CPP Class */ void useCppClass() { Animal animal; animal.setName("dog"); animal.setAge(2); animal.showInfo(); } /* C and C++ 結構體的區別 */ void useCppStruct() { Person p; p.setName("zeno"); p.setAge(20); p.showPersonInfo(); }
在C++中 , 使用類與使用結構體 , 用法並沒有二致 , 只是結構不能使用new
而類可使用 , new
出來的是一個對象指針 。
相信你們對引用並不陌生 , 在Java中 , 咱們經常將對象變量叫作對象引用 , 在C++中也不例外 , C++中的引用也能夠做爲對象變量 , 但C++中的引用不會開闢新的空間 , 去存儲指向對象內存空間的地址值 , 而是做爲對象引用的一個別名 。
簡單示意圖
引用示例
/* CPP 引用 */ #include <iostream> namespace CPP_QUOTE { class Quote { public: int x = 10; // 引用 ,就是傳入變量的別名,引用不會開闢新的內存空間,如同指針同樣,指向的是傳入變量的內存空間 // 通常做爲函數參數或返回值 // 引用使用方便 void swip(int &a, int &b) { int c = 0; c = a; a = b; b = c; } // 指針交換 void swip_p(int* a , int* b) { int c = 0; c = *a; *a = *b; *b = c; } }; }
引用在函數傳值的時候, 能夠當指針來使用 , 引用最普遍的用途就在於 , 在函數參數中 , 充當指針用 。
引用使用
/* C++ 引用的使用 */ /* CPP Quote */ using namespace CPP_QUOTE; void useCppQuote() { Quote q; // Quote q 的別名 Quote &q1 = q; q1.x = 100; printf("q的內存地址 : %#x , q1的內存地址:%#x\n", &q, &q1); cout << " q == " << q.x << endl; int x = 20, y = 40; q1.swip(x, y); cout << " q swipe x = " << x << " y = " << y << endl; // 指針值交換 q1.swip_p(&x, &y); cout << " 指針值交換 : x = " << x << " y = " << y << endl; }
打印對象的地址與引用變量的地址 , 咱們會發現內存地址是一致 , 由於引用是變量的別名 , 不會建立新的內存空間。
有了C語言基礎 , 學C++ , 只要掌握語法的差別性和一些C++的特性 , C++仍是很容易上手的 , 基礎語法 , 須要動手練 , 多作實驗 , 慢慢就會熟能生巧 。