首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 面試經典:手寫 String 類完整實現

     編輯:關於C++

核心功能點

一個合格的 String 類需正確管理動態記憶體,實現拷貝構造、移動構造、拷貝賦值、移動賦值、析構,並提供常用訪問接口。

關鍵實現細節

  • 構造函數:默認構造分配單字符 `\0`;C 字串構造深拷貝;拷貝構造同樣深拷貝。
  • 拷貝賦值:採用 copy-and-swap 惯用法,參數按值傳遞(利用拷貝構造),再 `swap`,自動處理自賦值且異常安全。
  • 移動語義 (C++11):移動構造/賦值竊取資源指針,置空來源,避免深拷貝開銷。
  • swap:交換內部指針,O(1) 操作。
  • 訪問器:`size()` 返回長度,`c_str()` 返回 C 字串指針。

代碼骨架

class String {
    char* data_;
public:
    String() : data_(new char[1]) { *data_ = '\0'; }
    String(const char* s) : data_(new char[strlen(s)+1]) { strcpy(data_, s); }
    String(const String& rhs) : data_(new char[rhs.size()+1]) { strcpy(data_, rhs.c_str()); }
    ~String() { delete[] data_; }

    String& operator=(String rhs) { swap(rhs); return *this; } // copy-and-swap

    String(String&& rhs) noexcept : data_(rhs.data_) { rhs.data_ = nullptr; }
    String& operator=(String&& rhs) noexcept { swap(rhs); return *this; }

    size_t size() const { return strlen(data_); }
    const char* c_str() const { return data_; }
    void swap(String& rhs) { std::swap(data_, rhs.data_); }
};

面試加分點

  1. 講清 copy-and-swap 為何異常安全。
  2. 說明移動語義如何避免雙重釋放。
  3. 指出 `size()` 每次調用 `strlen` 為 O(n),可優化為存儲長度成員。

總結

手寫 String 類是考察 C++ 資源管理、規則 of three/five、異常安全、移動語義的綜合題,掌握上述模板即可應對大多數面試場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved