接續(xù)【C語言基礎系列】
前言
在進行NDK開發(fā)的時候 , 我們使用的很多第三方庫 , 大多數(shù)都是使用的C/C++編寫的 , 有些可能是C和C++混編的 。如,我在NDK系列中提到的增量更新使用的兩個庫 bsdiff和bzip2 。那么 , 我們在學完C語言之后 , 有必要研究一下C++,因為C++是C的拓展 , 加入了面向對象和模板技術 ,那么基本語法就不用介紹了。本系列假定你具有一定的編程經驗,對面向對象有一定的了解 。
命名空間
在Java中 , 我們使用包來區(qū)分文件的所在路徑和類來自哪個包 ,使用package來聲明文件在哪個文件目錄下 , 進而在使用的時候可以區(qū)分 , 來自不同的包的相同類名 。在C++里面沒有package關鍵字 , 而是使用namespace來作為區(qū)分 , 在PHP中也是如此 , 在PHP5.0的時候引入的了namespace來做為區(qū)分不同路徑下的同名函數(shù)和類 。
定義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;
}
};
}
}
使用namespace
// 標準命名空間 (包含很多標準的定義)
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標準函數(shù) 。
C++ 類 與 結構體
C++是面向對象語言 , 面向對象語言的一大特征就是可以將類型整合起來 , 可以創(chuàng)建類型實例 。
創(chuàng)建C++類
/*
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++字段和函數(shù)都是采用的共享權限修飾符 , 值得注意的是 , 在C++中 , 結構體里面的屬性和函數(shù)也具有權限訪問修飾符 。
/*
CPP Struct
*/
namespace CPP_STRUCT
{
// C++結構體與C結構不同之處在于 , 在C++中結構體內字段函數(shù)可以有權限修飾符,用法和類用法一致
// 和類不同的是 , 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++ 結構體的區(qū)別
*/
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;
// 引用 ,就是傳入變量的別名,引用不會開辟新的內存空間,如同指針一樣,指向的是傳入變量的內存空間
// 一般作為函數(shù)參數(shù)或返回值
// 引用使用方便
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;
}
};
}
引用在函數(shù)傳值的時候, 可以當指針來使用 , 引用最廣泛的用途就在于 , 在函數(shù)參數(shù)中 , 充當指針用 。
引用使用
/* 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;
}
打印對象的地址與引用變量的地址 , 我們會發(fā)現(xiàn)內存地址是一致 , 因為引用是變量的別名 , 不會創(chuàng)建新的內存空間。
結語
有了C語言基礎 , 學C++ , 只要掌握語法的差異性和一些C++的特性 , C++還是很容易上手的 , 基礎語法 , 需要動手練 , 多做實驗 , 慢慢就會熟能生巧 。