Những điểm mới trong c++ 11

      No Comments on Những điểm mới trong c++ 11
  1. Auto

Dùng từ khóa auto để tiết kiệm thời gian viết code, quy tắc là nếu trình biên dịch hiểu rồi thì không cần viết từ khóa đó nữa. Thư viện folly dùng auto mọi lúc có thể.

c1

2. nullptr

Trước C++ 11 thì số 0 dùng chung cho cả null và số nguyên 0, điều này gây ra 1 sự mơ hồ, C++ đưa ra khái niệm nullptr để gán null cho con trỏ.  Ví dụ về confuse

f(int);
f(foo *);

Trong mã nguồn mở folly thì toàn bộ null của con trỏ đều sử dụng nullptr.

3. Smart pointer

Update 12/09/2018. Nên dùng std::make_unique, std::make_shared để khởi tạo link

Smart pointer là khái niệm và mình muốn sử dụng con trỏ nhưng không cần giải phóng bộ nhớ. Tránh lỗi quên giải phóng bộ nhớ dẫn tới bị memory leak. Trong c++ 11 thì họ cung cấp 4 loại để implement smart pointer.

  • auto_ptr
  • unique_ptr
  • shared_ptr
  • weak_ptr

Thằng auto_ptr bị deprecated trong C++ 11 và bị removed trong C++ 17 chúng ta sẽ dùng unique_ptr để thay thế. Dưới đây là ví dụ về unique_ptr

#include<iostream>
#include<memory>
class A {
public:
	void show() {
		std::cout << "A::Show()" << std::endl;
	}
	~A() {
		std::cout << "~A()" << std::endl;
	}
};

void classic_ptr() {
	std::unique_ptr<int[]> a(new int(50));
	auto  b = std::make_unique<int[]>(50);
	a[0] = 10;
	b[10] = 10;
	std::cout << "a[0]=" << a[0] <<" b[10]="<<b[10]<<std::endl;
}
int main() {
	std::unique_ptr<A> p1(new A);
	p1->show();
	// return the memory address of p1.
	std::cout <<"p1.get() "<< p1.get()<< std::endl;
	// transfer ownership to p2.
	auto p2 = move(p1);
	// show all information
	std::cout <<"p1.get() "<< p1.get() << std::endl<< "p2.get() " << p2.get() << std::endl; p2->show();

	// Example of classic type
	classic_ptr();
	system("pause");
	return 0;
}

Không thể gán unique_ptr được


// Error: can't copy unique_ptr
unique_ptr<A> ptr2 = ptr1;

Chỉ dùng unique_ptr khi ta chỉ muốn 1 con trỏ là ownership.

Sự khác nhau giữa unique_ptr và auto_ptr là auto_ptr chuyển ownership bằng hàm phép gán còn unique_ptr dùng hàm move. Nếu như muốn nhiều pointer cùng trỏ đến resource thì dùng shared_ptr

 


// C++ program to demonstrate shared_ptr
#include<iostream>
#include<memory>
using namespace std;
 
class A
{
public:
    void show()
    {
        cout<<"A::show()"<<endl;
    }
};
 
int main()
{
    shared_ptr<A> p1 (new A);
    cout << p1.get() << endl; p1->show();
    shared_ptr<A> p2 (p1);
    p2->show();
    cout << p1.get() << endl;
    cout << p2.get() << endl;
 
    // Returns the number of shared_ptr objects
    //referring to the same managed object.
    cout << p1.use_count() << endl;
    cout << p2.use_count() << endl;
 
    // Relinquishes ownership of p1 on the object
    //and pointer becomes NULL
    p1.reset();
    cout << p1.get() << endl;
    cout << p2.use_count() << endl;
    cout << p2.get() << endl;
 
    return 0;
}

4- Strongly-typed enums

C++ có 2 loại enum:

  • enum class:  Không ngầm định convert.  Cho phép đặt trùng tên giữa các enum.
  • enum bình thường: Ngầm định covert sang kiểu int, thường sẽ tự tăng, bị lỗi khi đặt trùng tên.

 

 enum class Color { red, green, blue }; // enum class
 enum Animal { dog, cat, bird, human }; // plain enum : 0,1,2,3

Example of enum


#include <iostream>
enum Color {red, green, blue};
enum Card {red_card,green_card,blue_card};

enum class Animal {dog,deer,cat,bird,human};
enum class Mammal {kangaroo, deer, human};

// do not allow enum inheritance

int main() {
	Color color = Color::red;
	Card card = Card::green_card;

	int num = color; // no problem

	if (color == Card::red_card) // no problem (bad)
		std::cout << "bad" << std::endl;
	if (card == Color::green) // no problem (bad)
		std::cout << "bad" << std::endl;

	// example of good use of enum classes (safe)
	Animal a = Animal::deer;
	Mammal m = Mammal::deer;

	int num2 = a;// error
	if (m == a) //error (good)
		std::cout << "bad" << std::endl;
	if (a == Mammal::deer) // error (good)
		std::count << "bad" << std::endl;
	system("pause");
	return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *