Cách chuyển đổi kiểu dữ liệu trong C++

Cach Chuyen Doi Kieu Du Lieu Trong C



Quá trình thay đổi kiểu dữ liệu của một biến thành một biến khác được gọi là chuyển đổi kiểu hoặc ép kiểu trong C++. Điều này được thực hiện để thực hiện các phép toán trên các biến có kiểu dữ liệu khác nhau, bằng cách làm cho các kiểu dữ liệu của chúng tương thích với nhau. Chuyển đổi loại tối ưu hóa mã. Ví dụ: khi tính hiệu giữa hai biến, nếu một số thuộc kiểu float và số kia thuộc kiểu dữ liệu số nguyên thì kiểu dữ liệu số nguyên sẽ được chuyển thành kiểu float để thực hiện phép trừ.

Cách chuyển đổi kiểu dữ liệu trong C++

Trong C++, có hai cách để thay đổi kiểu dữ liệu:

Chuyển đổi loại ngầm định

Theo các quy tắc được xác định trước bởi trình biên dịch mã C++, chuyển đổi kiểu tiềm ẩn là chuyển đổi kiểu được trình biên dịch thực hiện tự động mà không yêu cầu bất kỳ kích hoạt bên ngoài nào từ người dùng. Kiểu chuyển đổi này thường diễn ra trong một chương trình khi có nhiều hơn một kiểu dữ liệu và kiểu dữ liệu của biểu thức không khớp với kiểu dữ liệu của biến liên quan đến biểu thức này.







Để tránh mất dữ liệu trong quá trình chuyển đổi, trình biên dịch theo mặc định sẽ thay đổi kiểu dữ liệu có độ chính xác thấp bằng kiểu dữ liệu có độ chính xác cao hơn. Ví dụ: nó sẽ chuyển đổi một số nguyên thành số float thay vì thay đổi số float thành số nguyên để tránh mất dữ liệu. Đây được gọi là khuyến mãi. Sau đây là sơ đồ ưu tiên cho các loại dữ liệu khác nhau.





Thứ tự chuyển đổi loại

Thứ tự đúng để chuyển đổi loại được đưa ra là:





bool -- > char -- > int ngắn -- > int -- > int không dấu -- > dài -- > dài không dấu -- > dài dài -- > trôi nổi -- > gấp đôi -- > dài gấp đôi

Biến loại có độ chính xác thấp được chuyển đổi thành loại dữ liệu có độ chính xác cao để tránh mất dữ liệu.

ví dụ 1

Trong ví dụ này, phép cộng được thực hiện trên biến có kiểu dữ liệu khác nhau bằng cách sử dụng chuyển đổi kiểu ẩn.



#include
sử dụng không gian tên tiêu chuẩn ;

int chủ yếu ( ) {
int con số = 100 ;
ký tự tính cách = 'C' ;
cout << '100 + 'C' = ' << con số + tính cách << kết thúc ;

trôi nổi giá trị = con số + 'c' ;
cout << 'giá trị float(100 + 'c') = ' << giá trị << kết thúc ;

int đã từng là = 7890 ;
dài không phải = đã từng là ;
cout << 'var_int =' << không phải ;
trở lại 0 ;
}

Ở đây, một số nguyên và một ký tự từ bảng ASCII, số float và ký tự 'c' được thêm vào. Số nguyên được giữ trong phân đoạn thứ ba dưới dạng kiểu dữ liệu dài và các kiểu dữ liệu được chính trình biên dịch thay đổi dựa trên các quy tắc được xác định trước của nó.

Tổng của 100 và ‘C’ trả về 167 vì ‘C’ tương đương với 67 về số và 100+’c’ trả về 199 dưới dạng chữ thường ‘c’ tương đương với 99. Biến int được lưu trữ trong kiểu dữ liệu long.

Ví dụ 2

Trong ví dụ này, ký tự D được chuyển thành float để thực hiện phép chia.

#include
sử dụng không gian tên tiêu chuẩn ;

int chủ yếu ( ) {
ký tự x = 'D' ;

trôi nổi float_var ;

float_var = trôi nổi ( x ) / 'c' ;
// Chuyển đổi rõ ràng một int thành float.

cout << 'Giá trị của float_var là:' << float_var << kết thúc ;

trở lại 0 ;
}

Giá trị đầu vào ở dạng ký tự D được lưu trữ trong kiểu dữ liệu float và được chia tiếp cho ký tự C. Các ký tự này được thay đổi thành giá trị số và thao tác chia được thực hiện trên chúng, trả về giá trị trong float.

Chuyển đổi loại rõ ràng

Người dùng phải thay đổi kiểu dữ liệu theo cách thủ công bằng cách chuyển đổi kiểu rõ ràng của C++, thường được gọi là truyền kiểu. Kiểu truyền này được thực hiện để tránh chuyển đổi kiểu tiềm ẩn. Có hai phương pháp để thực hiện Truyền kiểu rõ ràng trong C++:

  • Chuyển đổi bằng Toán tử gán
  • Chuyển đổi bằng cách sử dụng Toán tử truyền

Chuyển đổi kiểu bằng toán tử gán trong C++

Chuyển đổi loại bằng Toán tử gán được thực hiện một cách bắt buộc, nghĩa là một loại dữ liệu được chuyển đổi thủ công sang loại khác. Điều này được thực hiện bằng cách sử dụng toán tử gán “=”, gán giá trị của toán hạng bên phải cho biến ở bên trái của nó.

Ví dụ
Chương trình này tính diện tích hình tròn bằng cách sử dụng kiểu ép kiểu.

#include
#include
sử dụng không gian tên tiêu chuẩn ;
int chủ yếu ( )
{
int bán kính ;
cout <> bán kính ;
trôi nổi khu vực = M_PI * bán kính * bán kính ;
cout << 'Diện tích hình tròn có bán kính' << bán kính << ' = ' << khu vực ;
}

Toán tử gán được sử dụng để gán giá trị float cho vùng, bao gồm giá trị bán kính ở kiểu dữ liệu số nguyên.

Diện tích của hình tròn được trả về ở kiểu dữ liệu float, trong khi bán kính được nhập vào ở kiểu dữ liệu số nguyên. Do đó, kiểu dữ liệu của biến được thay đổi thông qua việc ép kiểu bằng toán tử gán.

Chuyển đổi kiểu bằng cách sử dụng toán tử truyền trong C++

Việc chuyển đổi kiểu được thực hiện bằng cách sử dụng toán tử ép kiểu, toán tử này buộc một kiểu dữ liệu thay đổi thành kiểu khác theo nhu cầu của chương trình.

Có bốn Toán tử truyền khác nhau:

  • tĩnh_cast
  • const_cast
  • động_cast
  • diễn giải lại_cast

1: tĩnh_cast

static_cast là toán tử truyền được sử dụng để chuyển đổi rõ ràng các số float và ký tự thành số nguyên, v.v. Đây là toán tử cast cơ bản nhất. Nó có thể truyền các kiểu dữ liệu có bản chất tương tự nhau. Nó có thể chuyển đổi con trỏ từ dạng này sang dạng khác, do đó nó cũng có thể được sử dụng để quản lý bộ nhớ.

Cú pháp

tĩnh_cast ( sự biểu lộ )

Ví dụ
Chương trình này được xây dựng để chuyển đổi một biến double thành kiểu dữ liệu int bằng static_cast. Nó sẽ cắt bỏ bất kỳ phần thập phân nào trong đầu ra.

#include
sử dụng không gian tên tiêu chuẩn ;
int chủ yếu ( )
{
// khai báo một biến
gấp đôi P ;
P = 2,905 * 1.235 * 24.675 ;
trôi nổi kết quả ;

cout << ' Trước khi sử dụng diễn viên tĩnh:' << kết thúc ;
cout << ' Giá trị của p = ' << P << kết thúc ;

// sử dụng static_cast để chuyển đổi kiểu dữ liệu
kết quả = tĩnh_cast ( P ) ;
cout << ' Sau khi sử dụng tính năng truyền tĩnh: ' << kết thúc ;
cout << ' Giá trị của kết quả = ' << kết quả << kết thúc ;

trở lại 0 ;
}

Ban đầu, một biến kép p được nạp với các giá trị được nhân với nhau và được lưu trong kết quả. Kết quả chứa kết quả trước và sau toán tử static_cast:

Trước khi sử dụng toán tử static_cast, kết quả được hiển thị dưới dạng dấu thập phân, trong khi sau khi sử dụng toán tử này, kết quả được hiển thị dưới dạng dữ liệu số nguyên.

2: const_cast

Toán tử const_cast được sử dụng để chuyển đổi giá trị không đổi của một đối tượng thành loại không cố định. Nó được sử dụng khi một đối tượng không đổi được khai báo và đôi khi chúng ta cần thay đổi giá trị của nó.

Cú pháp

const_cast ( sự biểu lộ )

Ví dụ
Trong ví dụ này, toán tử const_cast được sử dụng để tạm thời loại bỏ vòng loại hằng và cho phép thực hiện các thay đổi trong biến theo nhu cầu:

#include
sử dụng không gian tên tiêu chuẩn ;
int chủ yếu ( ) {
hằng số int x = 70 ;
hằng số int * = & x ;
cout << 'Giá trị cũ là' << * << ' \N ' ;
int * Với = const_cast ( ) ;
* Với = 90 ;
cout << 'Giá trị mới là' << * ;
trở lại 0 ;
}

Vòng loại hằng số được gán cho biến int x có nghĩa là biến này không thể được sửa đổi trực tiếp. Sau đó, int *y là một con trỏ được sử dụng để truy cập x, nhưng nó vẫn không thể thay đổi và giá trị ban đầu của nó được hiển thị bằng cout. Sử dụng toán tử const_cast, một con trỏ z được tạo không cố định, nó được sử dụng để truy cập giá trị của x làm cho nó có thể chỉnh sửa được. Nó thay đổi giá trị được gán cho z bằng 90, điều này gián tiếp thay đổi giá trị trong x.

Ban đầu, giá trị của biến không đổi x là 70, giá trị này được sửa đổi bằng cách sử dụng toán tử const_cast, biến nó thành 90.

3: động_cast

với hệ thống phân cấp kế thừa, còn được gọi là downcast an toàn kiểu. Truyền xuống là quá trình chuyển đổi một tham chiếu hoặc con trỏ thành một lớp dẫn xuất từ ​​một tham chiếu hoặc con trỏ của lớp cơ sở.

Cú pháp

động_cast ( sự biểu lộ )

Ví dụ
Trong ví dụ này, toán tử Dynamic_cast được sử dụng để kiểm tra loại lớp đa hình và nó cho phép truy cập vào cả thành viên lớp cơ sở và lớp dẫn xuất.

#include
#include
sử dụng không gian tên tiêu chuẩn ;
lớp học TBase
{
công cộng :
trôi nổi cơ sở_g = 9,81 ;

ảo trống rỗng đồ giả ( )
{

} ;
} ;

lớp học TDDriver : công cộng TBase
{
công cộng :
int local_g = 9,78 ;
} ;

int chủ yếu ( )
{

TBase * căn cứ = mới TDDriver ;
TDDriver * nguồn gốc ;

nguồn gốc = động_cast ( căn cứ ) ;

cout < cơ sở_g << kết thúc ;
cout < local_g << kết thúc ;

lấy than ( ) ;
trở lại 0 ;
}

Hai lớp được định nghĩa là lớp cơ sở và lớp dẫn xuất. Một cơ sở con trỏ kiểu TBase* được tạo và gán cho một đối tượng được cấp phát động kiểu TDerived. Một đối tượng lớp dẫn xuất có thể được gán cho một con trỏ lớp cơ sở trong trường hợp đa hình này. Dynamic_cast kiểm tra xem con trỏ có truy cập vào đối tượng hợp lệ của TDerived hay không, nếu việc truyền đạt kết quả thành công thì lớp dẫn xuất sẽ nhận được kết quả hợp lệ, nếu không nó sẽ trả về giá trị null.

4: diễn giải lại_cast

reinterpret_cast biến đổi con trỏ của một kiểu dữ liệu thành con trỏ của kiểu dữ liệu khác. Nó không kiểm tra xem kiểu dữ liệu của con trỏ có giống nhau hay không. Toán tử đúc này cần được sử dụng và xử lý cẩn thận.

Ví dụ
Trong hình minh họa này, con trỏ của một kiểu dữ liệu được diễn giải lại thành con trỏ của kiểu dữ liệu khác bằng cách sử dụng reinterpret_cast:

#include
sử dụng không gian tên tiêu chuẩn ;

int chủ yếu ( )
{
int * q = mới int ( 70 ) ;
ký tự * ch = diễn giải lại_cast ( q ) ;
cout << * q << kết thúc ;
cout << * ch << kết thúc ;
cout << q << kết thúc ;
cout << ch << kết thúc ;
trở lại 0 ;
}

Ban đầu, một số nguyên được gán giá trị 70. Con trỏ q trỏ tới số nguyên được cấp động này. reinterpret_cast được sử dụng để diễn giải lại con trỏ q dưới dạng con trỏ ký tự ch, có nghĩa là bộ nhớ ban đầu được gán cho q bây giờ được xử lý như thể nó là một ký tự. Sử dụng lệnh cout, nó in giá trị được gán cho q và ch. Vì ch được coi như một con trỏ ký tự nên nó sẽ trả về một giá trị ký tự.

Nó in giá trị trỏ tới ch bằng cách sử dụng *ch. Tuy nhiên, vì ch được coi như một con trỏ ký tự nên dòng này sẽ diễn giải bộ nhớ dưới dạng một ký tự. Nó in địa chỉ bộ nhớ được lưu trong con trỏ ch bằng ch. Đây là địa chỉ bộ nhớ giống như q vì nó chỉ là sự diễn giải lại của cùng một bộ nhớ.

Ban đầu, số nguyên lưu trữ 70. Sau đó, số nguyên này được thao tác giữa con trỏ q và con trỏ ch. Đầu ra 2 và 4 giống nhau vì giá trị thứ hai được diễn giải lại bằng reinterpret_cast.

Ghi chú : Bạn không nên sử dụng toán tử truyền này cho đến khi và trừ khi rất cần thiết vì nó khiến đối tượng trở thành một sản phẩm không di động

Phần kết luận

Quá trình thay đổi kiểu dữ liệu của một biến thành một biến khác được gọi là chuyển đổi kiểu hoặc ép kiểu trong C++. Điều này được thực hiện để thực hiện các phép toán trên các biến có kiểu dữ liệu khác nhau, bằng cách làm cho các kiểu dữ liệu của chúng tương thích với nhau. Chuyển đổi loại tối ưu hóa mã. Có các chuyển đổi kiểu ngầm định và rõ ràng trong C++. Việc chuyển đổi kiểu ngầm định được thực hiện bởi chính trình biên dịch bằng cách sử dụng một bộ quy tắc được xác định trước, trong khi việc chuyển đổi kiểu rõ ràng được lập trình viên thực hiện bằng cách sử dụng các toán tử gán và toán tử ép kiểu.