C++ 對C的擴充套件有哪些

西北野狼發表於2024-10-03

C++對C的擴充套件主要體現在以下幾個方面:

  1. 語法增強
    • 變數宣告位置更靈活:在C語言中,函式內的所有區域性變數必須在函式開頭的塊內進行宣告。而C++放鬆了這一限制,可以在函式內的任何位置宣告變數,只要在使用該變數之前進行宣告即可。例如:
    void someFunction() {
        // C++中可以在迴圈內部宣告變數
        for (int i = 0; i < 10; i++) {
            // 這裡的 i 是在迴圈內部宣告的區域性變數
            std::cout << i << std::endl;
        }
    }
    
    • 支援預設引數:C++允許為函式的引數指定預設值。在呼叫函式時,如果沒有提供相應的引數值,則使用預設值。這使得函式呼叫更加靈活和方便。例如:
    void printMessage(std::string message = "Hello, World!") {
        std::cout << message << std::endl;
    }
    
    int main() {
        // 呼叫函式時使用預設引數
        printMessage();
        // 也可以傳入自己的引數
        printMessage("This is a custom message.");
        return 0;
    }
    
  2. 資料型別擴充套件與增強
    • 新增bool型別:C語言中沒有專門的布林型別,通常用整數來表示邏輯值(0 表示假,非 0 表示真)。C++引入了bool型別,取值為true(表示真)和false(表示假),使邏輯表達更加清晰和直觀。例如:
    bool isTrue = true;
    bool isFalse = false;
    
    • const的增強:在C語言中,const關鍵字的作用主要是限制變數的值不能被修改,但在複雜的表示式中,其語義可能不太明確。C++中的const更加強大,可以用於修飾函式的引數、返回值以及成員函式等,提供更好的常量性保證和程式碼的安全性。例如:
    void someFunction(const int parameter) {
        // 在函式內部無法修改 parameter 的值
    }
    
  3. 物件導向特性
    • 類和物件:這是C++最重要的擴充套件之一。C++支援物件導向程式設計,允許定義類來封裝資料和操作。類可以包含成員變數(資料)和成員函式(操作),透過類可以建立物件,實現資料的隱藏和封裝、繼承、多型等物件導向的特性。例如:
    class Rectangle {
    private:
        int width;
        int height;
    public:
        Rectangle(int w, int h) : width(w), height(h) {}
        int getArea() const {
            return width * height;
        }
    };
    
    int main() {
        Rectangle rect(5, 10);
        std::cout << "Area: " << rect.getArea() << std::endl;
        return 0;
    }
    
    • 運算子過載:C++允許使用者自定義運算子的行為,以便對自定義型別的物件進行操作。透過運算子過載,可以使程式碼更加簡潔和直觀。例如,可以為自定義的類過載+-*/等運算子。
    class Complex {
    private:
        double real;
        double imag;
    public:
        Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
        // 過載 + 運算子
        Complex operator+(const Complex& other) const {
            return Complex(real + other.real, imag + other.imag);
        }
    };
    
  4. 輸入輸出流
    • C++提供了更強大、更靈活的輸入輸出流(iostream庫)來替代C語言中的printfscanf函式。輸入輸出流使用<<>>運算子進行操作,支援各種資料型別的輸入和輸出,並且具有更好的型別安全性和可擴充套件性。例如:
    #include <iostream>
    
    int main() {
        int num;
        std::cout << "Enter a number: ";
        std::cin >> num;
        std::cout << "You entered: " << num << std::endl;
        return 0;
    }
    
  5. 名稱空間:在大型專案中,可能會出現命名衝突的問題。C++引入了名稱空間的概念,可以將程式碼封裝在不同的名稱空間中,避免命名衝突。名稱空間還可以巢狀使用,並且可以隨時向已有的名稱空間中新增新的成員。例如:
    namespace namespace1 {
        int variable = 10;
        void function() {
            std::cout << "This is function in namespace1" << std::endl;
        }
    }
    
    namespace namespace2 {
        int variable = 20;
        void function() {
            std::cout << "This is function in namespace2" << std::endl;
        }
    }
    
  6. 異常處理:C++提供了異常處理機制,用於處理程式執行時可能出現的錯誤和異常情況。透過try-catch語句塊,可以捕獲和處理異常,使程式更加健壯和可靠。例如:
    int divide(int a, int b) {
        if (b == 0) {
            throw "Division by zero error!";
        }
        return a / b;
    }
    
    int main() {
        try {
            int result = divide(10, 0);
            std::cout << "Result: " << result << std::endl;
        } catch (const char* errorMessage) {
            std::cerr << "Error: " << errorMessage << std::endl;
        }
        return 0;
    }
    
  7. 模板:模板是C++的一種高階特性,包括函式模板和類别範本。函式模板可以根據不同的引數型別自動生成相應的函式版本,類别範本可以根據不同的型別引數建立不同的類例項。模板提高了程式碼的複用性和可擴充套件性。例如:
    // 函式模板
    template <typename T>
    T maximum(T a, T b) {
        return (a > b)? a : b;
    }
    
    // 類别範本
    template <typename T>
    class Stack {
    private:
        T* data;
        int size;
    public:
        Stack() : size(0) {
            data = new T[10];
        }
        ~Stack() {
            delete[] data;
        }
        void push(T value) {
            data[size++] = value;
        }
        T pop() {
            return data[--size];
        }
    };
    
  8. 增強的結構體:在C++中,結構體不僅可以包含成員變數,還可以包含成員函式,這使得結構體的功能更加強大,可以像類一樣進行封裝和操作。例如:
    struct Point {
        int x;
        int y;
        // 結構體內部的成員函式
        void print() const {
            std::cout << "(" << x << ", " << y << ")" << std::endl;
        }
    };
    

相關文章