C++對C的擴充套件主要體現在以下幾個方面:
- 語法增強:
- 變數宣告位置更靈活:在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; }
- 資料型別擴充套件與增強:
- 新增
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 的值 }
- 新增
- 物件導向特性:
- 類和物件:這是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); } };
- 輸入輸出流:
- C++提供了更強大、更靈活的輸入輸出流(
iostream
庫)來替代C語言中的printf
和scanf
函式。輸入輸出流使用<<
和>>
運算子進行操作,支援各種資料型別的輸入和輸出,並且具有更好的型別安全性和可擴充套件性。例如:
#include <iostream> int main() { int num; std::cout << "Enter a number: "; std::cin >> num; std::cout << "You entered: " << num << std::endl; return 0; }
- C++提供了更強大、更靈活的輸入輸出流(
- 名稱空間:在大型專案中,可能會出現命名衝突的問題。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; } }
- 異常處理: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; }
- 模板:模板是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]; } };
- 增強的結構體:在C++中,結構體不僅可以包含成員變數,還可以包含成員函式,這使得結構體的功能更加強大,可以像類一樣進行封裝和操作。例如:
struct Point { int x; int y; // 結構體內部的成員函式 void print() const { std::cout << "(" << x << ", " << y << ")" << std::endl; } };