1. 程式人生 > 其它 >二、C/C++簡述

二、C/C++簡述

2.1 第一個C++程式

#include <iostream>    // 系統輸入輸出流標頭檔案,也可以寫成“#include <iostream.h>”,類似於#include <stdio.h>。
// 注意:系統標頭檔案可以不帶“.h”,但是引入自己的標頭檔案不可以省略。
using namespace std;    // std:標準,該句程式碼表示使用標準名稱空間

// 主函式
int main()
{
    cout << "Hello World! 你好中國!" << endl;    // endl類似於C語言中的換行符“\n”。
    // cout代表的是輸出裝置,類似於C語言中的printf;<< 表示該內容指向(流向)輸出裝置,在endl後面一樣可以拼接;
    // cin代表的是輸入裝置,類似於C語言中的scanf;比如:
    int num = 0;
    cin >> num;    // 將鍵盤輸入的資料賦值給num
    cout << "num = " << num << endl;
    return 0;
}

/**********************************************************************************************************
 * C和C++的對比:
 * 1. C語言是面向過程的語言:其核心思想是功能分解,自頂向下,逐層細化,程式=資料結構+演算法;
 *     資料結構:表示對資料的儲存方式,即資料型別(int long short char string float struct array 連結串列等);
 *     演算法:就是對儲存號的資料進行分析的步驟,即功能函式。
 * 2. C++是面向物件的語言:其核心思想是功能模組化(類的封裝和繼承),即每個模組只提供一種特定的功能,各模組之間相互獨立,
 * 該方法增加了程式碼的複用率,有利於軟體的開發、維護和升級。物件=資料結構+演算法=物件+物件+物件+……
 **********************************************************************************************************/

2.2 C++的三大特性

  1. 封裝:
    指把客觀的事物封裝成抽象的類,且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資料資訊隱藏。類將成員變數和成員函式封裝在類的內部,根據需要設定訪問許可權,通過成員函式管理內部狀態。

  2. 繼承:
    指類之間的相互關係,繼承的作用是子類擁有父類的特徵和能力,避免公共程式碼的重複開發,減少程式碼和資料冗餘。

  3. 多型:
    指“一個介面,多種方法”,即多種形態,程式在執行的過程中才決定呼叫的函式,它是面向物件的核心概念。

2.3 C++是C語言的擴充套件

#include <iostream>    // 系統輸入輸出流標頭檔案,也可以寫成“#include <iostream.h>”,類似於#include <stdio.h>。
// 注意:系統標頭檔案可以不帶“.h”,但是引入自己的標頭檔案不可以省略。
using namespace std;    // std:標準,該句程式碼表示使用標準名稱空間


/****************************************************************************************************
 * 1.全域性變數的定義與使用:
 *     ① “::”表示作用域運算子(C++獨有,C沒有);
 ****************************************************************************************************/
int a = 30;    // 全域性變數
void test01()
{
    int a = 40;    // 區域性變數
    cout<<"區域性變數a="<<a<<endl;    // 就近優先選擇區域性變數
    cout<<"全域性變數a="<<::a<<endl;    // 此時就選擇全域性變數
}

/****************************************************************************************************
 * 2.名稱空間的定義與使用,名稱空間內可以使變數,也可以是函式等內容:
 *     ① 只能在全域性範圍內定義;
 *     ② 名稱空間可巢狀;
 *     ③ 名稱空間是開放的,可以隨時新增新成員進去;
 *     ④ 名稱空間中的函式,可以在該名稱空間外部定義;
 *     ⑤ 無名名稱空間:“namespace {}”,表示該名稱空間只能在本檔案內訪問使用,相當於該其添加了static,使其作為內部
 * 連結,不建議使用該名稱空間;
 *     ⑥ 給名稱空間取一個別名;
 ****************************************************************************************************/
namespace{    // 無名名稱空間
    int b = 25;
    void func()
    {
        cout << "無名名稱空間中的func遍歷b = " << b << endl;
    }
}
namespace A {    // 定義一個名字為A的名稱空間
    int a = 10;
}
namespace B {
    int a = 20;
    int b = 35;
    void func(){    // 定義名稱空間中的函式
        cout << "名稱空間B中的func遍歷a = " << a << endl;    // 這裡的a就是B::a,訪問同一名稱空間內的內容a不用加作用域運算子
    }
}
namespace C {
    int a = 50;
    namespace D {
        int a = 60;
    }
}
namespace A {    // 表示往名稱空間A中新增新元素,也可以直接在上面名稱空間內新增
    int b = 15;
    void func();    // 在名稱空間外編輯成員函式內容,但是需要在名稱空間內宣告該函式
}
void A::func()    // 在名稱空間外定義該編輯空間的成員函式。
{
    cout << "func遍歷b = " << b << endl;    // 這裡的a就是B::a,自己家的a不需要再加作用域運算子
}
namespace veryLongName {
    int c = 11;
    void func(){
        cout << "func遍歷c = " << c << endl;
    }
}

int test02()
{
    func();    // 呼叫無名名稱空間中的函式
    cout << "A::a = :" << A::a << endl;
    cout << "B::a = :" << B::a << endl;
    B::func();    // 呼叫名稱空間B中的函式
    cout << "C::D::a = " << C::D::a << endl;
    A::func();

    // 給名稱空間取別名
    namespace vLN = veryLongName;
    vLN::func();
    return 0;
}

/****************************************************************************************************
 * 3.using宣告的使用:using編譯指令是整個名稱空間識別符號在該作用空間中可用。
 *     ① 即當我們兩個名稱空間中都有相同的變數,但是相同變數的值不同,我們如果在某個方法中需要使用某特定的值,我們直接
 * 在該方法開始書寫“using namespace A”即可;
 *     ② 缺點是容易衝突,仔細使用;
 *     ④ using namespace A:凡是在本方法中沒有定義的變數或方法,在預設條件下都使用名稱空間A中的變數或方法,如果命
 * 名空間中也沒有,就從全域性查詢並使用。
 *     ③ 指明使用名稱空間中的某個成員:using B::b;
 ****************************************************************************************************/
void test03()
{
    using namespace B;    // 使用名稱空間B
    using B::b;    // 使用名稱空間B中特定的元素b
    cout << "名稱空間B中的b = " << b << endl;
}

/****************************************************************************************************
 * 4.C++語法增強:
 *     ① C++是強語法語言,所以在函式定義和引數傳值的時候必須嚴格定義函式返回值型別(即函式開頭的型別)和傳值型別(形
 * 參的型別);
 *     ② C語言中可以不定義形參型別,此時傳入的實參可以使任意型別。
 * 5.C++嚴格的型別轉換:不同型別的變數一般是不能直接賦值的,需要相應的強轉。
 * 6.C++結構體:
 *     ① 定義結構體時C/C++都需要有關鍵詞“struct”關鍵詞修飾;
 *     ② 在使用結構體時,C++不需要加關鍵字“struct”,使用修飾也不會報錯,而C需要修飾;
 *     ③ 結構體成員既可以是成員變數,也可以是是成員函式,而C只能定義成員變數。
 ****************************************************************************************************/
struct Student{    //定義結構體
    string mName;    // 成員變數
    int mAge;
    void setName(string name){ mName = name; }    // 成員函式
    void setAge(int age){ mAge = age; }    // 嚴格的型別定義,表現了C++的強語法性
    void showStudent(){ cout << "Name:" << mName << endl << "Age:" << mAge << endl; }
};
void test04()
{
    Student stu;    // 使用結構體時,不需要struct關鍵詞修飾。此句表示引用結構體,並給其取個別名stu
    stu.setName("John");    // 給結構體函式傳參,並呼叫結構體函式
    stu.setAge(20);
    stu.showStudent();
}

/****************************************************************************************************
 * 7.新增“bool”型別關鍵字:true和false,分別儲存為1和0,佔一個位元組。
 *     ① 其實C語言的C99版本開始有bool型別,但是需要引入包含標頭檔案“stdbool.h”,就可以使用和C++一樣的bool型別了。
 * 8.三目運算子:a>b?a:b,在C語言中返回的是數值(即變數的值),而在C++中返回的是變數本身(引用)。
 * 9.C++中的const:
 *     ① 字面意思,常數,不變的數值,它是一個限定符,用來限定一個變數不允許改變,將一個物件轉換成一個常量;
 *     ② C++中用const修飾的常量是內部連結常量,即只在本檔案中起作用,外部檔案不可見(可使用external修飾,用於外部使
 * 用),而C中為外部連結,可外部使用;
 *     ③ C++中const表示常量,不需要分配記憶體長度,而C中表示只讀變數,需要分配記憶體長度;
 *     ④ C++中全域性const,當宣告extern或者對變數進行取地址時,編譯器會為其分配記憶體空間,變數儲存在只讀資料段,否則不
 * 開闢記憶體空間,記憶體中的資料不可修改;
 *     ⑤ 當以變數的形式初始化const修飾的變數時,系統也會為其分配記憶體空間,如“const int a=b;”,系統直接為a開闢空間
 * 而不建立符號表中;
 *     ⑥ 對於自定義資料型別,如類物件,也會分配記憶體空間,如:const Person person;
 *     ⑦ 儘量用const替換巨集(#define)。
 * 10.C中的const:
 *     ① const修飾的全域性變數,變數名只讀,記憶體空間在文學常量區(只讀),不可修改;
 *     ② const修飾的區域性變數,變數名只讀,記憶體分配在棧區(可讀寫),可通過尋訪變數地址來簡介修改空間內容;
 ****************************************************************************************************/
void test05()
{
    cout << sizeof (false) << endl;    // 輸出結果為1,表示bool型別佔一個位元組大小
    bool flag = true;    // C語言中沒有這種型別
    flag = 100;    // 給bool型別賦值時,非0值會自動轉換成true(1),0值直接轉換成false(0)
    cout << flag << endl;    // 輸出結果為1

    // C++中的const
    const int constA = 10;    // 給常量賦值,變數名和值存於符號常量表,此時還沒有開闢記憶體空間
    cout << "constA:" << constA << endl;    // 輸出結果為10,輸出符號表中的值
    int* p = (int*)&constA;    // 尋訪變數constA的地址,此時給constA開闢記憶體空間,並將constA=10儲存在開闢的記憶體空間中
    *p = 300;    // 並修改constA地址中的值
    cout << "*p:" << *p << endl;    // 輸出結果為300,表示修改成功
    cout << "constA:" << constA << endl;    // 輸出結果仍為10,輸出的是符號表中的值,但地址中的值已經被修改。
    cout << "*&constA:" << &constA << endl;    // 輸出結果為:0x61feb8,儲存地址
    cout << "*p:" << *&p << endl;    // 輸出結果為:0x61feb8,儲存地址

    const Student stu = {"Han", 27};
    cout << "stu.Name: " << stu.mName << endl << "stu.Age: " << stu.mAge << endl;
}


// 主函式
int main()
{
    /*************************************************************************************************
    cout << "Hello World! 你好中國!" << endl;    // endl類似於C語言中的換行符“\n”。
    // cout代表的是輸出裝置,類似於C語言中的printf;<< 表示該內容指向(流向)輸出裝置,在endl後面一樣可以拼接;
    // cin代表的是輸入裝置,類似於C語言中的scanf;比如:
    int num = 0;
    cin >> num;    // 將鍵盤輸入的資料賦值給num
    cout << "num = " << num << endl;
    **************************************************************************************************/
    // test01();
    // test02();
    // test03();
    // test04();
    test05();
    return 0;
}