接續(xù)【C語言基礎(chǔ)系列】
前言
在進(jìn)行NDK開發(fā)的時(shí)候 伟恶, 我們使用的很多第三方庫 冤寿, 大多數(shù)都是使用的C/C++編寫的 霎槐, 有些可能是C和C++混編的 送浊。如,我在NDK系列中提到的增量更新使用的兩個(gè)庫 bsdiff
和bzip2
丘跌。那么 袭景, 我們?cè)趯W(xué)完C語言之后 唁桩, 有必要研究一下C++,因?yàn)镃++是C的拓展 耸棒, 加入了面向?qū)ο蠛湍0寮夹g(shù) 荒澡,那么基本語法就不用介紹了。本系列假定你具有一定的編程經(jīng)驗(yàn)与殃,對(duì)面向?qū)ο笥幸欢ǖ牧私?单山。
命名空間
在Java中 , 我們使用包來區(qū)分文件的所在路徑和類來自哪個(gè)包 奈籽,使用package
來聲明文件在哪個(gè)文件目錄下 , 進(jìn)而在使用的時(shí)候可以區(qū)分 鸵赫, 來自不同的包的相同類名 衣屏。在C++里面沒有package
關(guān)鍵字 , 而是使用namespace
來作為區(qū)分 辩棒, 在PHP中也是如此 狼忱, 在PHP5.0的時(shí)候引入的了namespace
來做為區(qū)分不同路徑下的同名函數(shù)和類 。
定義namespace
/*
cpp namespace demo
*/
#include <iostream>
/*
自定義命名空間 一睁, 相當(dāng)于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
// 標(biāo)準(zhǔn)命名空間 (包含很多標(biāo)準(zhǔn)的定義)
using namespace std;
// use namespace
using namespace NSP_A;
/*
使用自定義命名空間
*/
void useNameSpace() {
A a;
a.sayHello();
// 嵌套命名空間使用
NSP_A_1::A a2;
a2.sayHello();
}
在C++中也定義了一些標(biāo)準(zhǔn)命名空間 , 如std
者吁,C++中也兼容C語言語法 窘俺, 可以引入C語言頭文件,使用C標(biāo)準(zhǔn)函數(shù) 复凳。
C++ 類 與 結(jié)構(gòu)體
C++是面向?qū)ο笳Z言 瘤泪, 面向?qū)ο笳Z言的一大特征就是可以將類型整合起來 , 可以創(chuàng)建類型實(shí)例 育八。
創(chuàng)建C++類
/*
cpp class type
*/
#include <iostream>
using namespace std;
namespace CPP_CLASS
{
class Animal {
// C++ 共用權(quán)限訪問修飾符
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ù)都是采用的共享權(quán)限修飾符 , 值得注意的是 髓棋, 在C++中 实檀, 結(jié)構(gòu)體里面的屬性和函數(shù)也具有權(quán)限訪問修飾符 。
/*
CPP Struct
*/
namespace CPP_STRUCT
{
// C++結(jié)構(gòu)體與C結(jié)構(gòu)不同之處在于 按声, 在C++中結(jié)構(gòu)體內(nèi)字段函數(shù)可以有權(quán)限修飾符膳犹,用法和類用法一致
// 和類不同的是 , 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;
}
};
}
結(jié)構(gòu)體和類最大的不同是 签则, 結(jié)構(gòu)體不能繼承 镣奋, 不能進(jìn)行抽象化。
使用C++類 與 結(jié)構(gòu)體
/* 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++ 結(jié)構(gòu)體的區(qū)別
*/
void useCppStruct() {
Person p;
p.setName("zeno");
p.setAge(20);
p.showPersonInfo();
}
在C++中 怀愧, 使用類與使用結(jié)構(gòu)體 侨颈, 用法并無二致 余赢, 只是結(jié)構(gòu)不能使用new
而類可以使用 , new
出來的是一個(gè)對(duì)象指針 哈垢。
引用
相信大家對(duì)引用并不陌生 侍筛, 在Java中 榛斯, 我們常常將對(duì)象變量叫做對(duì)象引用 , 在C++中也不例外 , C++中的引用也可以作為對(duì)象變量 季率, 但C++中的引用不會(huì)開辟新的空間 , 去存儲(chǔ)指向?qū)ο髢?nèi)存空間的地址值 卤唉, 而是作為對(duì)象引用的一個(gè)別名 硅卢。
簡(jiǎn)單示意圖
引用示例
/*
CPP 引用
*/
#include <iostream>
namespace CPP_QUOTE {
class Quote {
public:
int x = 10;
// 引用 ,就是傳入變量的別名渴频,引用不會(huì)開辟新的內(nèi)存空間芽丹,如同指針一樣,指向的是傳入變量的內(nèi)存空間
// 一般作為函數(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í)候卜朗, 可以當(dāng)指針來使用 拔第, 引用最廣泛的用途就在于 , 在函數(shù)參數(shù)中 场钉, 充當(dāng)指針用 蚊俺。
引用使用
/* C++ 引用的使用 */
/* CPP Quote */
using namespace CPP_QUOTE;
void useCppQuote() {
Quote q;
// Quote q 的別名
Quote &q1 = q;
q1.x = 100;
printf("q的內(nèi)存地址 : %#x , q1的內(nèi)存地址:%#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;
}
打印對(duì)象的地址與引用變量的地址 , 我們會(huì)發(fā)現(xiàn)內(nèi)存地址是一致 逛万, 因?yàn)橐檬亲兞康膭e名 泳猬, 不會(huì)創(chuàng)建新的內(nèi)存空間。
結(jié)語
有了C語言基礎(chǔ) 宇植, 學(xué)C++ 暂殖, 只要掌握語法的差異性和一些C++的特性 , C++還是很容易上手的 当纱, 基礎(chǔ)語法 呛每, 需要?jiǎng)邮志?, 多做實(shí)驗(yàn) 坡氯, 慢慢就會(huì)熟能生巧 晨横。