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,關注後即可獲取最新文章推送
看完如果覺得有幫助,歡迎 點贊、收藏、關注