Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các tính năng C++11 trong Visual Studio 2015

C++11 được ISO phê chuẩn tháng 8/2011. Visual Studio 2015 hỗ trợ hầu hết các tính năng cốt lõi của C++11.

Các tính năng chính

1. nullptr - Con trỏ null kiểu an toàn

// Cũ: NULL hoặc 0 - có thể chuyển ngầm sang int
int* p1 = NULL;
int* p2 = 0;

// Mới: nullptr_t - không chuyển ngầm sang integral
int* p3 = nullptr;
void func(int);
void func(int*);
func(nullptr); // Gọi overload int* chắc chắn

2. Lambda expressions (Biểu thức lambda)

// Lambda cơ bản
auto add = [](int a, int b) { return a + b; };
cout << add(3, 4); // 7

// Capture bằng giá trị/tham chiếu
int x = 10;
auto captureValue = [x]() { return x; };     // x = 10
auto captureRef = [&x]() { return x; };      // tham chiếu x
x = 20;
cout << captureValue() << " " << captureRef(); // 10 20

// Generic lambda (C++14)
auto generic = [](auto a, auto b) { return a + b; };

3. auto - Deduction kiểu tự động

auto x = 42;        // int
auto y = 3.14;      // double
auto ptr = new int(10); // int*
auto& ref = x;      // int&
const auto& cref = x; // const int&

// Với container - rất hữu ích
std::vector v = {1,2,3};
for (auto it = v.begin(); it != v.end(); ++it) { ... }
for (auto& elem : v) { ... } // range-based for

4. override và final

class Base {
    virtual void foo() {}
    virtual void bar() {}
};

class Derived : Base {
    void foo() override {} // OK - override virtual
    // void foo() final {}  // Lỗi: final trên override
    void baz() override {} // LỖI: Base không có baz()
    
    void bar() final {} // OK - override và khóa không override nữa
};

class MoreDerived : Derived {
    // void bar() {} // LỖI: bar() là final
};

5. Deleted và Defaulted functions

class NonCopyable {
public:
    NonCopyable() = default;      // Yêu cầu compiler sinh default ctor
    NonCopyable(const NonCopyable&) = delete; // Cấm copy
    NonCopyable& operator=(const NonCopyable&) = delete; // Cấm assign
    
    ~NonCopyable() = default;     // Default dtor
};

6. Strongly-typed enums (enum class)

// Cũ: unscoped enum - pollute namespace
enum Color { RED, GREEN, BLUE };
Color c = RED; // OK nhưng RED leak ra scope

// Mới: scoped enum
enum class Color { Red, Green, Blue };
Color c = Color::Red; // Phải qualify
// int x = c; // LỖI: không chuyển ngầm sang int
int x = static_cast(c); // Ép kiểu tường minh

7. static_assert và type traits

#include 

static_assert(sizeof(int) == 4, "int phải 4 bytes");
static_assert(std::is_pod::value, "Phải là POD");

// C++17: _v suffix
static_assert(std::is_pod_v);

8. Range-based for loops

std::vector v = {1, 2, 3, 4, 5};
for (auto& x : v) { x *= 2; } // Sửa đổi
for (const auto& x : v) { cout << x; } // Read-only
for (auto x : v) { ... } // Copy (tránh nếu object lớn)

// C-array cũng dùng được
int arr[] = {1,2,3};
for (int x : arr) { ... }

Tóm tắt hỗ trợ VS2015

Tính năngVS2015
nullptr✓ Hoàn toàn
Lambda✓ Hoàn toàn
auto✓ Hoàn toàn
override/final✓ Hoàn toàn
=delete/=default✓ Hoàn toàn
enum class✓ Hoàn toàn
static_assert✓ Hoàn toàn
Range-based for✓ Hoàn toàn
Variadic templates✓ Hoàn toàn
Initializer lists✓ Hoàn toàn
Smart pointers✓ (std::unique_ptr, shared_ptr)