Sử dụng C ++ unique_ptr

Use C Unique_ptr



Các con trỏ thông minh được sử dụng để phân bổ tài nguyên động. Nhiều loại con trỏ thông minh được sử dụng trong C ++ cho các mục đích khác nhau, chẳng hạn như auto_ptr , unique_ptr , và shared_ptr . Con trỏ auto_ptr không được chấp nhận trong phiên bản C ++ mới. Unique_ptr được sử dụng để thay thế auto_ptr. Đối tượng của con trỏ này có thể có quyền sở hữu con trỏ. Đối tượng của con trỏ này sở hữu con trỏ duy nhất và không con trỏ nào khác có thể trỏ tới đối tượng. Unique_ptr tự động xóa các đối tượng. Con trỏ này quản lý các đối tượng đó nếu các đối tượng bị phá hủy, hoặc giá trị của đối tượng bị thay đổi hoặc hàm reset () được gọi. Các tính năng của unique_ptr và cách sử dụng con trỏ này được thảo luận trong hướng dẫn này.

Thành phần chính:







Hai thành phần chính của đối tượng unique_ptr được cung cấp bên dưới:



A. Con trỏ được lưu trữ:



Nó được sử dụng để quản lý các đối tượng được tạo bởi một con trỏ duy nhất. Nó được tạo tại thời điểm tạo con trỏ và nó có thể được thay đổi theo nhiều cách khác nhau.





B. Deleter được lưu trữ:

Nó nhận đối số của kiểu con trỏ được lưu trữ được sử dụng để xóa đối tượng được quản lý. Nó cũng được tạo tại thời điểm tạo con trỏ và nó có thể được thay đổi bằng nhiều cách khác nhau.



Ví dụ 1: Tạo một đối tượng con trỏ của một lớp với hàm tạo

Cách khai báo các đối tượng con trỏ duy nhất của một lớp và truy cập phương thức của lớp là sử dụng các đối tượng như trong ví dụ sau. Một lớp với một phương thức khởi tạo và một phương thức công khai đã được khai báo trong mã. Hàm tạo có ba đối số. Con trỏ duy nhất đầu tiên đã được tạo bằng cách gọi hàm tạo với ba giá trị đối số. Các Kết quả() phương thức được gọi bởi đối tượng con trỏ tính tổng ba giá trị đối số của hàm tạo. Tiếp theo, đối tượng con trỏ duy nhất thứ hai được tạo mà không cần gọi hàm tạo và con trỏ đầu tiên được chuyển đến con trỏ thứ hai. Các Kết quả() phương thức được gọi bởi đối tượng con trỏ thứ hai.

//Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespace std;

//Xác định lớp
bổ sung lớp học{

int number1, number2, number3;
công cộng:
//Khai báo hàm tạo
Thêm vào(int a, int b, int c)
{
number1 = a;
number2 = b;
số3 = c;
}
//Khai báo phương pháp để tính toánTổng
int Kết quả()
{
trở lạinumber1 + number2 + number3;
}
};
int main()
{
//Khai báo con trỏ đầu tiên
con trỏ unique_ptr1(bổ sung mới(Bốn năm,55,30));

Giá cả<<'Kết quả của tổng bằng cách sử dụng con trỏ đầu tiên:'<Kết quả() <<' ';
//Khai báo con trỏ thứ hai
con trỏ unique_ptr2;
//Di chuyển con trỏ đầu tiên sang con trỏ thứ hai
pointer2 = di chuyển(con trỏ1);

Giá cả<<'Kết quả của tổng bằng cách sử dụng con trỏ thứ hai:'<Kết quả() <<' ';
trả lại0;
}

Đầu ra:

Kết quả sau sẽ xuất hiện sau khi thực hiện đoạn mã trên. Tổng của 45, 55 và 30 là 130 đã được in cho cả hai con trỏ.

Ví dụ 2: Tạo một đối tượng con trỏ của một lớp với hàm tạo và mã hủy

Cách khai báo một đối tượng con trỏ duy nhất của một lớp với hàm tạo và hàm hủy đã được trình bày trong ví dụ sau. Lớp chứa một phương thức khởi tạo với một đối số, một phương thức công khai có tên là Display () với giá trị của biến lớp và một hàm hủy sẽ in ra một thông báo hủy trước khi hủy đối tượng của lớp. Phương thức Display () được gọi sau khi tạo đối tượng con trỏ duy nhất trong mã.

//Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespace std;

//Xác định lớp
khách hàng đẳng cấp
{
tên chuỗi;

công cộng:
//Khai báo hàm tạo
Khách hàng(chuỗi n)
{
tên = n;
Giá cả<<'Tài nguyên được phân bổ. ';
}

//Khai báo phương thức in tên khách hàng
Hiển thị vô hiệu()
{
Giá cả<<'Tên của khách hàng là:'<<Tên<<' ';
}

//Khai báo hàm hủy
~ Khách hàng()
{
Giá cả<<'Tài nguyên bị phá hủy. ';
}
};
int main()
{
//Phân bổ đối tượng Tài nguyên thuộc sở hữu của unique_ptr
unique_ptruPointer{khách hàng mới('Mir Abbas') };
uPointer->Trưng bày();
trả lại0;
}

Đầu ra:

Kết quả sau sẽ xuất hiện sau khi thực hiện đoạn mã trên:

Ví dụ 3: Kiểm tra con trỏ sau khi chuyển nhượng quyền sở hữu

Cách để kiểm tra quyền sở hữu của con trỏ duy nhất đã chỉ ra trong ví dụ sau bằng cách tạo hai con trỏ duy nhất của một lớp. Một lớp có hai biến chuỗi và một phương thức công khai đã được khai báo trong mã. Phương thức Book_details () của lớp được gọi sau khi tạo đối tượng con trỏ duy nhất đầu tiên của lớp. Tiếp theo, đối tượng con trỏ duy nhất thứ hai đã được tạo và con trỏ đầu tiên đã được di chuyển đến con trỏ thứ hai để phá hủy con trỏ đầu tiên. Quyền sở hữu của cả hai con trỏ nên được kiểm tra sau.

//Bao gồm các thư viện cần thiết

#bao gồm

#bao gồm

usingnamespace std;

//Xác định lớp
Sách học{

tiêu đề chuỗi ='Ngôn ngữ lập trình C ++';
tác giả chuỗi ='Bjarne Stroustrup';

công cộng:
//Khai báo phương thức in chi tiết sách
voidBook_details()
{
Giá cả<<'Tên sách: '<<chức vụ<<' ';
Giá cả<<'Tên tác giả: '<<tác giả<<' ';
}
};
int main()
{
//Khai báo con trỏ đầu tiên
con trỏ unique_ptr1(sách mới());

con trỏ1->Book_details();
//Khai báo con trỏ thứ hai
con trỏ unique_ptr2;
//Di chuyển con trỏ đầu tiên sang con trỏ thứ hai
pointer2 = di chuyển(con trỏ1);

//Kiểm tra con trỏ đầu tiên
nếu như (static_cast(con trỏ1))Giá cả<<'Người khảo sát đầu tiên không phải là rỗng ';
elsecout<<'Người khảo sát đầu tiên là rỗng ';
//Kiểm tra con trỏ thứ hai
nếu như (static_cast(con trỏ2))Giá cả<<'Người khảo sát thứ hai không rỗng ';
elsecout<<'Người khảo sát thứ hai là rỗng ';

trả lại0;
}

Đầu ra:

Kết quả sau sẽ xuất hiện sau khi thực hiện đoạn mã trên. Theo kết quả đầu ra, quyền sở hữu của con trỏ đầu tiên đã bị xóa và thông báo, Con trỏ đầu tiên là null đã in cho con trỏ đầu tiên. Quyền sở hữu của con trỏ thứ hai tồn tại và thông báo, Con trỏ đầu tiên không null đã in cho con trỏ thứ hai:

Phần kết luận:

Mục đích của việc sử dụng một con trỏ duy nhất trong lập trình C ++ đã được mô tả trong hướng dẫn này bằng cách sử dụng nhiều ví dụ. Các cách tạo con trỏ duy nhất, chuyển quyền sở hữu con trỏ và kiểm tra quyền sở hữu hiện tại của con trỏ đã được giải thích ở đây để giúp bạn đọc biết cách sử dụng con trỏ duy nhất đúng cách.