← Trang chủ

[Wiki] C++11 những cái hay dùng

Bài tham khảo từ link:
http://www.codeproject.com/Articles/570638/Ten-Cplusplus-Features-Every-Cplusplus-Developer

Sử dụng auto

Trong C++11 từ khóa auto được dùng để compiler có thể tự nhận diện type của dữ liệu đầu vào thông qua rvalue

VD:

auto a = 1; // is equal with int a = 1
auto a = 1f // is equal with float a = 1.f
auto a = new foo(); // is equal with *a = new foo();

Có một lưu ý là khi sử dụng auto cho biến bất kì thì ta luôn phải initialize cho biến đó.
VD: auto a; // error

Sử dụng nullptr

Để gán giá trị null cho con trỏ

int *p = nullptr;

ForEach

Duyệt tất cả các phần tử của mảng

VD

int arr[5] = {1, 2, 3, 4, 5};
for( auto &a : arr)
{
    cout<< a << endl; // in ra màn hình 1, 2, 3, 4, 5
}

Override và final

Cái này là một định danh.
Giả sử với vd sau:

class B
{
public:
    virtual void f(short)
    {
        std::cout << "B::f" << std::endl;
    }
};

class D : public B
{
public:
    virtual void f(int)
    {
        std::cout << "D::f" << std::endl;
    }
};

Trường hợp này, function f ở class D là overload (vì param truyền vào là khác kiểu nhau).
Hoặc với vd khác:

class B
{
public:
    virtual void f(int) const
    {
        std::cout << "B::f " << std::endl;
    }
};

class D : public B
{
public:
    virtual void f(int)
    {
        std::cout << "D::f" << std::endl;
    }
};

Ở trường hợp này function f ở class D vẫn là overload chứ ko phải là override. Để tránh gây nhầm lẫn, C++11 thêm định danh là override và final giống như trong java. 2 từ khóa này có thể đi liền nhau "override final"

class B
{
public:
    virtual void f(short)
    {
        std::cout << "B::f" << std::endl;
    }
    void g(short)
    {
        std::cout << "B::g" << std::endl;
    }
};

class D : public B
{
public:
    virtual void f(int) override
    {
        std::cout << "D::f" << std::endl;
    }
    virtual void g(int) override
    {
        std::cout << "D::g" << std::endl;   // error
    }
};

Lưu ý: override chỉ có tác dụng nếu function ở class base là virtual.

Enum class

VD có 2 enum

enum TV { on, off};
enum LAMP { on, off};

Cả 2 enum này đều có key giống nhau, dẫn đến compiler không phân biệt
được. Cách giải quyết ở phiên bản cũ là dùng namespace, tuy nhiên ở
C++11 cái này đơn giản hơn bằng cách sử dụng enum class như sau:

enum class TV
{
    on, off
};
enum class LAMP
{
    on, off
};

TV::on;
LAMP::on; // no error

Lambda

Đây là điểm mới mà C++03 không có

Cấu trúc nó là capture-list { body };
VD:

int a = 10;
auto func1 = [=]()
{
    int x = a;
    std::cout<< x << std::endl;
    //a += 10; // error
};
auto func2 = [&]()
{
    a += 10;
};

func1(); // x = 10;
func2(); // a = 20;

[&] sẽ giúp complier hiểu được là biến a được khai báo
bên ngoài lambda function sẽ được tham chiếu vào trong lambda function.
Còn [=] có nghĩa là copy giá trị của a vào trong hàm lambda, tuy nhiên
không thể thay đổi giá trị của a. (chỉ có tác dụng copy).

Tác giả

crossover

Đăng vào

Bài viết gốc

Thông tin

Proudly published with Statinamic