NDK開發(fā)---C++學(xué)習(xí)(一):基礎(chǔ)知識

前言

C++是從C語言發(fā)展演變而來的,它在C語言的基礎(chǔ)上引入了類(class)的概念,并增加了抽象與封裝、繼承、重載和多態(tài)等面向?qū)ο蟮恼Z言處理機(jī)制。C++向前兼容了C語言程序設(shè)計(jì),使得絕大部分C程序可以不加修改就能在C++環(huán)境下編譯運(yùn)行,同時又提供了面向?qū)ο蟮某绦蛟O(shè)計(jì)機(jī)制,支持面向?qū)ο蟪绦蛟O(shè)計(jì),是一種面向過程與面向?qū)ο蟮幕旌暇幊陶Z言。

數(shù)據(jù)類型

C++的基本數(shù)據(jù)類型與C語言一致。但C++對C語言的結(jié)構(gòu)體、聯(lián)合、枚舉等自定義數(shù)據(jù)類型作了擴(kuò)展。C++中的結(jié)構(gòu)名、聯(lián)合名、枚舉名都是類型名,可以直接用于變量的聲明或定義,不必在結(jié)構(gòu)名、聯(lián)合名、枚舉名前加上前綴關(guān)鍵字struct、union、enum。
例如,對于下面的類型聲明:

enum color {black, white, red, blue, yellow};
struct strudent {
    char ID[6];
    char Name[6];
    int age;
}
union xy {
    int x;
    char y;
}

在C++程序中,可以用下面的形式定義相關(guān)類型的變量:

strudent s1;
xy x1;
color col;

局部變量聲明

在C語言中,局部變量要在函數(shù)的可執(zhí)行語句之前定義;在C++中,變量可在任何語句位置定義,只要允許出現(xiàn)程序語句的地方,都允許定義變量。

void main() {
    int x;           //L1
    x = 9;         //L2
    int y;          //L3:在C語言中不允許變量定義出現(xiàn)在執(zhí)行語句L2后面
    y = x + 1;   //L4
}

命名空間

在最初的C++標(biāo)準(zhǔn)中并沒有對命名空間的支持,要求程序在全局作用域中聲明的每個變量、函數(shù)、類型和模板等必須具有唯一的名字,如果在同一程序中有兩個名字相同的全局變量,將產(chǎn)生命名沖突。
如果一個程序由許多程序員共同編寫,大家也不能命名相同的全局變量名和函數(shù)名,否則將產(chǎn)生命名沖突,這就是所謂的全局命名空間污染問題。
名字污染問題處理起來并不容易,在大型程序中尤其困難。ISO/ANSI C++標(biāo)準(zhǔn)為了解決這個問題,引入了命名空間。命名空間是C++中的一種機(jī)制,用于防止程序中的同名問題,其方法是將一組給定的名稱(如變量名、常量名和類型名等)與一個命名關(guān)聯(lián)起來。例如,命名空間就相當(dāng)于一個能夠保持各種物品的倉庫,其中的函數(shù)名、類型名和變量名等就相當(dāng)于倉庫中的物品。
在一個命名空間中,可以定義許多不同的對象(包括變量、函數(shù)、類型和類等),這些對象的有限范圍局限在命名空間內(nèi)。在不同的命名空間中,可以定義同名的對象,只要兩個對象不在同一命名空間中,就不會引起沖突。

自定義命名空間

標(biāo)準(zhǔn)C++定義命名空間的關(guān)鍵字是namespace,它的語法如下:

namespace namespace_name {
    members;
}

namespace_name是程序員指定的命名空間的名字,只要是一個合法的C++標(biāo)識符都可以。members是命名空間中包括的成員,可以是變量定義、函數(shù)聲明、函數(shù)定義、結(jié)構(gòu)聲明,以及類的聲明等。例如:

namespace NSP_A {
    int a = 9;
    struct Teacher {
        char* name;
        int age;
    };

    struct Student {
        char* name;
        int age;
    };
}

命名空間的嵌套

namespace NSP_B {
    int a = 12;
    //命名空間嵌套
    namespace NSP_C {
        int c = 90;
    }

    struct Teacher {
        char* name;
        int age;
    };
}

命名空間的應(yīng)用,語法如下:

namespace_name::identifier

identifier就是命名空間的成員名,另外,標(biāo)準(zhǔn)C++提供了using命令簡化命名空間的使用,有兩種:
(1)引用命名空間的單個成員:

using namespace_name::identifier

(2)引用命名空間的全部成員:

using namespace namespace_name

例子如下:

void main() {
    NSP_A::a =  10;
    NSP_B::a  = 11;
    NSP_B::NSP_C::c = 100;

    //使用命名空間中的結(jié)構(gòu)體
    //NSP_A::Teacher t;
    //簡單點(diǎn)可以這樣
    using namespace NSP_A;
    Teacher t;
    t.age = 10;

    //由于Teacher在兩個命名空間中都有
    using NSP_A::Teacher;
    using NSP_B::Teacher;
    Teacher t1;
    t1.age = 35;
    Teacher t2;
    t2.age = 26;

    getchar();
}

std命名空間

ANSI/ISO標(biāo)準(zhǔn)的C++稱為標(biāo)準(zhǔn)C++,它增加了傳統(tǒng)C++中沒有的一些特征,是傳統(tǒng)C++的超集。兩種版本的C++區(qū)分方法是頭文件和命名空間。傳統(tǒng)C++采用與C語言同樣風(fēng)格的頭文件,以.h為擴(kuò)展名;標(biāo)準(zhǔn)C++為了兼容傳統(tǒng)C++,也支持C語言風(fēng)格的頭文件,但它創(chuàng)建了一種新式的頭文件,為標(biāo)準(zhǔn)C++庫所使用,這種頭文件沒有.h擴(kuò)展名。例如,傳統(tǒng)C++的頭文件有iostream.h、fstream.h和string.h;標(biāo)準(zhǔn)C++對應(yīng)的頭文件有iostream、fstream和string。
標(biāo)準(zhǔn)C++提供了與之對應(yīng)的新式函數(shù)庫,其頭文件的命名方法是:在原C函數(shù)庫對應(yīng)頭文件名的前面加上c前綴,并去掉.h。例如,C語言的頭文件有stdio.h、ctype.hmath.h,標(biāo)準(zhǔn)C++頭文件有cstdio、cctypecmath
標(biāo)準(zhǔn)C++將新格式頭文件中的內(nèi)容全部放到了std命名空間中,非新格式頭文件中的內(nèi)容則被直接放到了全局命名空間中。
標(biāo)準(zhǔn)C++中還可以這樣打印輸出:

std::cout << "this is C plus plus" << std::endl;

還可以全局引用std

#include<iostream>
using namespace std;

//自定義命名空間
namespace NSP_A {
    int a = 9;
    struct Teacher {
        char* name;
        int age;
    };

    struct Student {
        char* name;
        int age;
    };
}

namespace NSP_B {
    int a = 12;
    //命名空間嵌套
    namespace NSP_C {
        int c = 90;
    }

    struct Teacher {
        char* name;
        int age;
    };
}

void main() {
    //printf("this is C plus plus");
    //<<是運(yùn)算符重載
    //std::cout << "this is C plus plus" << std::endl;
    cout << "this is C plus plus" << endl;
    //使用自定義的命名空間
    //::訪問修飾符
    cout << NSP_A::a << endl;
    cout << NSP_B::a << endl;
    cout << NSP_B::NSP_C::c << endl;

    //使用命名空間中的結(jié)構(gòu)體
    //NSP_A::Teacher t;
    //簡單點(diǎn)可以這樣
    using namespace NSP_A;
    Teacher t;
    t.age = 10;

    //由于Teacher在兩個命名空間中都有
    using NSP_A::Teacher;
    using NSP_B::Teacher;
    Teacher t1;
    t1.age = 35;
    Teacher t2;
    t2.age = 26;

    getchar();
}

展望

本篇博客主要介紹了一些基本知識并與C語言進(jìn)行了簡單的比較,接下來我將介紹C++中的引用,敬請期待!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 一、 為什么需要命名空間(問題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域,用來處理程序中 常見的...
    IvanRunning閱讀 2,429評論 0 2
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 8,107評論 0 27
  • 高一那年,她喜歡上一個男孩子。男孩兒很普通,初遇在燥熱的夏天,一片綠茵的爬山虎下男孩兒朝著她不經(jīng)意的一笑,就是這溫...
    森綾閱讀 876評論 8 14
  • 我還是忍不住的去想他,就在突然間,我又想念他霸道而又強(qiáng)烈的熱吻,吻遍我每一寸肌膚,在我脖子上留下深深的吻痕,我貪戀...
    安安菇?jīng)?/span>閱讀 268評論 0 0

友情鏈接更多精彩內(nèi)容