動態

詳情 返回 返回

提升面試成功率:深入理解 C++ 11 新特性 - 動態 詳情

C++11是C++語言的一個重大更新,引入了許多新特性,包括自動類型推導、lambda表達式、右值引用、智能指針等等。這些新特性使得C++更加現代化、高效、易用。也是面試容很容易被問到一個問題,下面我將簡要介紹一些C++11的新特性

自動類型推導

C++11引入了auto關鍵字,可以讓編譯器自動推導變量的類型。這樣可以減少代碼中的重複代碼,提高代碼的可讀性和可維護性。例如:

auto i = 42; // 推導為int類型
auto d = 3.14; // 推導為double類型
auto s = "hello"; // 推導為const char*類型

lambda表達式

C++11引入了lambda表達式,可以方便地定義匿名函數。這樣可以減少代碼中的重複代碼,提高代碼的可讀性和可維護性。例如:

auto f = [](int x, int y) { return x + y; };
int z = f(1, 2); // z的值為3

右值引用

C++11引入了右值引用,可以方便地實現移動語義和完美轉發。這樣可以提高代碼的性能和效率。例如:

class MyString {
public:
    MyString() : data_(nullptr), size_(0) {}
    MyString(const char* str) : data_(new char[strlen(str) + 1]), size_(strlen(str)) {
        strcpy(data_, str);
    }
    MyString(MyString&& other) : data_(other.data_), size_(other.size_) {
        other.data_ = nullptr;
        other.size_ = 0;
    }
    ~MyString() {
        delete[] data_;
    }
private:
    char* data_;
    size_t size_;
};

更多關於右值引用的內容,感興趣的小夥伴可以翻看我之前的帖子,有專門的介紹。

智能指針

C++11引入了智能指針,可以方便地管理動態分配的內存,避免內存泄漏和懸空指針的問題。C++11中有兩種智能指針:std::unique\_ptr和std::shared\_ptr。

std::unique\_ptr是一種獨佔式智能指針,它擁有對動態分配的對象的唯一所有權。當std::unique\_ptr被銷燬時,它所擁有的對象也會被銷燬。例如:

std::unique_ptr<int> p(new int(42));
std::cout << *p << std::endl; // 輸出42

std::shared\_ptr是一種共享式智能指針,它可以被多個指針共享擁有權。當最後一個std::shared\_ptr被銷燬時,它所擁有的對象也會被銷燬。例如:

std::shared_ptr<int> p1(new int(42));
std::shared_ptr<int> p2 = p1;
std::cout << *p1 << " " << *p2 << std::endl; // 輸出42 42

C++11的智能指針使得動態內存管理更加方便和安全。

range-based for循環

C++11引入了range-based for循環,可以方便地遍歷容器中的元素。這樣可以減少代碼中的重複代碼,提高代碼的可讀性和可維護性。例如:

std::vector<int> v = {1, 2, 3, 4, 5};
for (auto x : v) {
    std::cout << x << std::endl;
}

nullptr

C++11引入了nullptr關鍵字,可以代替NULL宏定義。這樣可以避免一些潛在的錯誤。例如:

void f(int* p) {}
f(nullptr); // 可以編譯通過

constexpr

C++11引入了constexpr關鍵字,可以在編譯期間計算表達式的值。這樣可以提高代碼的性能和效率。例如:

constexpr int factorial(int n) {
    return n == 0 ? 1 : n * factorial(n - 1);
}
int x = factorial(5); // x的值為120

更多關於constexpr的內容,感興趣的小夥伴可以翻看我之前的帖子,有專門的介紹。

static\_assert

C++11引入了static\_assert關鍵字,可以在編譯期間檢查表達式的值是否為真。這樣可以避免一些潛在的錯誤。例如:

static_assert(sizeof(int) == 4, "int must be 4 bytes"); // 如果sizeof(int)不等於4,編譯會失敗

變長參數模板

C++11引入了變長參數模板,可以方便地處理可變數量的參數。這樣可以提高代碼的靈活性和可維護性。例如:

template<typename... Args>
void f(Args... args) {
    std::cout << sizeof...(args) << std::endl; // 打印參數的數量
}
f(1, 2, 3); // 打印3
f("hello", 3.14); // 打印2

線程支持庫

C++11引入了線程支持庫,可以方便地創建和管理線程。這樣可以提高代碼的併發性和可維護性。例如:

#include <iostream>
#include <thread>
void f() {
    std::cout << "hello, world" << std::endl;
}
int main() {
    std::thread t(f); // 創建一個新線程
    t.join(); // 等待線程結束
    return 0;
}

結尾

以上是C++11的一些新特性,它們使得C++更加現代化、高效、易用。

最後

為了方便其他設備和平台的小夥伴觀看往期文章:

微信公眾號搜索:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎 點贊、收藏、關注

user avatar leoyi 頭像 monkeynik 頭像 sunplay 頭像 ayuan01 頭像 jilodream 頭像 mstech 頭像 hnclou 頭像 shumile_5f6954c414184 頭像 chuanghongdengdeqingwa_eoxet2 頭像 buildyuan 頭像 tssc 頭像 dalideshoushudao 頭像
點贊 39 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.