Ép kiểu trong c

     

Ép vẻ bên ngoài trong C++ là việc gán giá trị của một biến tất cả kiểu dữ liệu này tới phát triển thành khác có kiểu tài liệu khác. Trong nội dung bài viết ngày hôm nay, họ sẽ tìm hiểu kĩ rộng về ép đẳng cấp trong C++ qua bai viết sau đây nhé.

Bạn đang xem: ép kiểu trong c


Danh Mục bài xích Viết

VI. Ép kiểu dáng Float trong CVII. Ép mẫu mã Int sang trọng String vào C++X. Phân một số loại Ép hình trạng Trong C++

I. Ép loại Trong C++ Là Gì

Toán tử ép thứ hạng (một cast) vào C++ là 1 toán tử quan trọng mà có tác dụng một kiểu dữ liệu này thay đổi thành kiểu tài liệu khác. Toán tử xay kiểu là một toán tử 1 ngôi và gồm cùng độ ưu tiên như bất kỳ toán tử một ngôi nào khác trong C++.

Cú pháp được dùng tiếp tục của toán tử ép loại trong C++ là:

(kieu_du_lieu) bieu_thuc

Ở đây, kieu_du_lieu là kiểu tài liệu bạn muốn. Dưới đây là một số toán tử ép thứ hạng được cung cấp bởi C++:

const_cast (bieu_thuc): Toán tử const_cast được áp dụng để ghi đè const và/hoặc volatile. đẳng cấp dữ liệu bạn muốn buộc phải hệt như kiểu dữ liệu nguồn ngoại trừ sự sửa đổi của những thuộc tính const hoặc volatile vào một cast. Dạng ép vẻ bên ngoài này làm việc thuộc tính const của đối tượng người dùng đã truyền: hoặc được cấu hình thiết lập hoặc gỡ bỏ.

dynamic_cast (bieu_thuc): Toán tử dynamic_cast vào C++ triển khai một ép hình dáng tại runtime nhưng thẩm tra tính hợp lệ của cast. Trường hợp cast tất yêu được sản xuất ra, cast này thua kém và biểu thức ước lượng là null. Một toán tử dynamic_cast tiến hành các cast trên các kiểu nhiều hình và rất có thể ép một bé trỏ A* thành một nhỏ trỏ B* chỉ khi đối tượng người dùng đang được trỏ tới đích thực là một đối tượng người dùng B.

reinterpret_cast (bieu_thuc): Toán tử reinterpret_cast trong C++ chuyển đổi 1 con trỏ tới bất kỳ kiểu bé trỏ khác. Nó cũng cho phép ép hình trạng từ con trỏ cho tới một hình dáng integer cùng ngược lại.

static_cast (bieu_thuc): Toán tử static_cast trong C++ tiến hành một cast không có tính đa hình. Ví dụ, nó rất có thể được dùng để làm ép hình trạng một con trỏ lớp đại lý thành một nhỏ trỏ lớp kế thừa.

Tất cả toán tử ép loại trên sẽ được sử dụng trong lúc thao tác với lớp với đối tượng. Bây giờ, chúng ta thử ví dụ như sau để hiểu toán tử nghiền kiểu đơn giản và dễ dàng trong C++. Copy và paste chương trình C++ sau vào tệp test.cpp, tiếp nối biên dịch với chạy chương trình:

#include using namespace std; main(){ double a = 15.65653; float b = 9.02; int c ; c = (int) a; cout Chạy lịch trình C++ trên vẫn cho kết quả như hình sau:

*
Ép giao diện Trong C++ Là Gì

II. Bí quyết Ép Kiểu dữ liệu Trong C++

III. Ép đẳng cấp Class trong C++

Ép dạng hình (Casting) là quá trình convert tự kiểu dữ liệu A lịch sự kiểu tài liệu B. C++ có 2 mẫu mã casting.

Implicit conversion: câu hỏi ép hình trạng được thực hiện tự động hóa bởi compiler.

int iVar = 10;float fVar = iVar; //fVar = 10.00Explicit conversion: ép dạng hình được triển khai bởi xây dựng viên.

int iVar = 20;float fVar = (float)iVar / 10;Ngôn ngữ C++ tư vấn 5 toán tử xay kiểu.– static_cast– const_cast– reinterpret_cast– dynamic_cast

static_cast

Ví dụ 1:

// static_cast_Operator.cpp // compile with: /LD class B ; class D : public B ; void f(B* pb, D* pd) D* pd2 = static_cast(pb); // Not safe, D can have fields // và methods that are not in B. B* pb2 = static_cast(pd); // Safe conversion, D always // contains all of B. Trong lấy một ví dụ 1

– Line B* pb2 = static_cast(pd); bình yên vì các thuộc tính và method của class B phần đông thuộc class D.– Line D* pd2 = static_cast(pb); không bình yên vì class D có các thuộc tính và method nhưng class B ko có. Mặc dù nhiên, câu lệnh này sẽ không báo lỗi khi chạy runtime bởi toán tử static_cast không có kiểm tra runtime (khác cùng với toán tử dynamic_cast). Điều thực sự nguy hiểm khi thực hiện *pd2 truy cập tới thuộc tinh với method chỉ trực thuộc lớp D cùng không thuộc lớp B –> lịch trình crash bởi ACCESS VIOLATION.

Ví dụ 2:

// static_cast_Operator_2.cpp // compile with: /LD /GR class B public: virtual void Test() ; class D : public B ; void f(B* pb) D* pd1 = dynamic_cast(pb); D* pd2 = static_cast(pb); Trong ví dụ 2

– trường hợp pb thực sự trỏ tới đối tượng người dùng class D, thì pd1 cùng pd2 sẽ có cùng giá trị, pd1 với pd2 sẽ có cùng quý giá nếu pd == 0 (NULL).– nếu như pb trỏ tới đối tượng người sử dụng class B, thì dynamic_static đang trả về 0, dẫu vậy static_cast không thể detect được sự việc này. Bởi vậy, vào trường hợp thực hiện static_cast, lập trình viên đề nghị kiểm tra nếu như pb trỏ tới đối tượng class D thì mới trả về nhỏ trỏ trỏ tới class D.

Ví dụ 3:

// static_cast_Operator_3.cpp // compile with: /LD /GR typedef unsigned char BYTE; void f() char ch; int i = 300; float f = 2.5; double dbl; ch = static_cast(i); // int khổng lồ char dbl = static_cast(f); // float to double i = static_cast(ch); Trong ví dụ 3,

– Toán tửstatic_cast được thực hiện để nghiền kiểu cho những kiểu dữ basic. Từ bỏ int –> char, float –> double, char –> int.– Câu lệnh “ch = static_cast(i); // int to lớn char” gây ra mất dữ liệu vì vẻ bên ngoài char (1 byte) không được chứa hình dạng int (4 bytes). Vày vậy, chỉ ép kiểu từ kiểu tài liệu NHỎ –> kiểu dữ liệu TO nhằm tránh convert sai.

const_cast

const_cast ( expression )

// expre_const_cast_Operator.cpp // compile with: /EHsc #include using namespace std; class CCTest public: void setNumber( int ); void printNumber() const; private: int number; ; void CCTest::setNumber( int num ) number = num; void CCTest::printNumber() const{ cout ( this )->number--; cout

*
Ép hình dáng Class vào C++

IV. Ép loại Tường Minh trong C++

Ép vẻ bên ngoài tường minh (Explicit type conversion) là quá trình đổi khác kiểu dữ liệu một giải pháp tường minh (rõ ràng) bởi lập trình viên, thực hiện toán tử ép kiểu (casting operator) để thực hiện việc gửi đổi.

Trong C++, bao gồm 5 phương pháp ép hình trạng tường minh:

C-style castsStatic castsConst castsDynamic castsReinterpret casts

Phạm vi bài học này sẽ nói đến C-style casts cùng Static casts, 2 cách phổ cập nhất vào C++.

Dynamic casts, Const casts với Reinterpret casts có nhu cầu các kiến thức chuyên sâu hơn, nên sẽ được bỏ qua trong bài học này.

C-style casts

Trong ngữ điệu C chuẩn, ép vẻ bên ngoài được tiến hành thông qua toán tử (), cùng tên kiểu tài liệu cần đưa được đặt bên trong.

Ví dụ:

#include using namespace std;int main(){ int n1 = 3; int n2 = 2; double d = (double)n1 / n2; cout Trong lịch trình trên, trình biên dịch (compiler) đổi khác biến n1 từ phong cách int sang hình dạng double trải qua ép hình dáng tường minh C-style. Tiếp nối biểu thức bao gồm 2 toán hạng tất cả kiểu double với kiểu int, cần toán hạng kiểu dáng int sẽ được thay đổi ngầm định sang thứ hạng double. Vị vậy, công dụng của biểu thức là phép chia giữa 2 số chấm hễ kiểu double.

Ngôn ngữ C++ cho phép thực hiện ép mẫu mã tường minh C-style cùng với cú pháp như một lời call hàm:

int n1 = 3;int n2 = 2;double d = double(n1) / n2;Ép loại tường minh C-style không được trình biên dịch (compiler) soát sổ tại thời điểm biên dịch (compile time), đề xuất trình biên dịch sẽ không còn đưa ra rất nhiều cảnh báo trong số những trường hợp chuyển đổi không đúng

Chú ý: Tránh thực hiện ép phong cách tường minh C-style.

static_cast

Ngôn ngữ C++ có một toán tử nghiền kiểu gọi là static_cast. Bạn đã biết đến nó trong bài xích KIỂU KÝ TỰ vào C++ (Character):

#include #include // for std::setprecision()using namespace std;int main(){ int n 75 ; cout (n) (ch) lịch trình trên thực hiện toán tử ép hình dạng static cast trong C++ nhằm in một ký kết tự từ một trong những nguyên và ngược lại.

Xem thêm: Giải Bài 2 Trang 168 Toán 11, Bài 2 Trang 168 Sgk Đại Số 11

Sử dụng static cast trong biểu thức:

Ví dụ:

#include using namespace std;int main(){ int n1 = 3; int n2 = 2; double d = static_cast(n1) / n2; cout Ưu điểm của toán tử static_cast là nó yêu mong compiler bình chọn kiểu dữ liệu tại thời gian biên dịch chương trình, giảm bớt được đều lỗi bên cạnh ý muốn.

Chú ý: Nên thực hiện toán tử static_cast thay do ép kiểu dáng C-style.

*
Ép giao diện Tường Minh trong C++

V. Ép Kiểu bé Trỏ trong C++

VI. Ép kiểu Float vào C

Chắc hẳn khi mới bắt đầu tập tành cùng với C/C++ người nào cũng gặp trường hợp nên ép thứ hạng int quý phái float và ngược lại. Vậy nội dung bài viết này mình vẫn hướng dẫn chúng ta cách ép hình dạng nguyên sang hình dáng thực trong C/C++.

Ép từ loại nguyên sang kiểu dáng thực

Ép thứ hạng int sang float

Có những trường hợp họ phải ép hình trạng từ int sang trọng float như ví dụ bên dưới đây

Bài toán: Nhập vào nhì số nguyên dương a và b. Hãy xuất ra hiệu quả a/b.

#include using namespace std; int main(){ int a, b; float kq; cout > a; cout > b; if (!b) {// Hoặc if(b==0) cout Nhap a: 2Nhap b: 3Ket qua la: 0Trong trường hòa hợp trên ta bắt buộc phải ép hình dáng int sang float. Cú pháp ép mẫu mã như sau:

kq = (float)a / (float)b;kq = float(a) / float(b);Ở trên tất cả hai bí quyết ép kiểu dẫu vậy mình khuyên các bạn nên dùng cách dưới, nhìn dễ nắm bắt hơn.

Cùng xem lại đoạn code sinh hoạt trên nhé

#include using namespace std; int main(){ int a, b; float kq; cout > a; cout > b; if (!b) {// Hoặc if(b==0) cout Nhap a: 2Nhap b: 3Ket qua la: 0.666667Ép vẻ bên ngoài int sang trọng double

Cách làm tương tự như như trên nhưng thôi.

Ép từ thứ hạng thực sang kiểu dáng nguyên

Ép vẻ bên ngoài float sang int

Ta có thể ép kiểu dữ liệu như sau:

#include using namespace std; int main(){ float a = 3.5f; int b = int(a); cout sau khoản thời gian ep kieu: 3Lưu ý: khi ép hình dạng từ int lịch sự float thì chỉ thừa nhận được những chữ số trước dấu phẩy mà lại thôi. Chứ không làm tròn lên nhé.

Ví dụ: int a = float(8.9) thì a đang nhận quý hiếm 8 cơ mà thôi.

Ép vẻ bên ngoài double sang int

Tương trường đoản cú như xay kểu float sang trọng int.

*
Ép thứ hạng Float trong C

VII. Ép giao diện Int thanh lịch String trong C++

Hướng dẫn giải pháp chuyển int lịch sự string trong C++. Bạn sẽ học được cách sử dụng hàm to_string() trong C++ sau bài học kinh nghiệm này.

Chúng ta bao gồm 2 phương thức để gửi int thanh lịch string trong C++ như sau:

Sử dụng hàm template (trước C++11)Sử dụng hàm to_string (từ C++11)

Chuyển float với int sang string trong C++ bởi hàm template

Phương pháp trước tiên cũng để chuyển int thanh lịch string vào C++ đó đó là sử dụng hàm template sau đây:

#include template std::string tostr(const T& t){ std::ostringstream os; osHàm template trên có tác dụng đổi khác kiểu số bao gồm cả int lẫn float sang hình dáng string. Sau khi đã khai báo template này, bạn cũng có thể sử dụng nó những lần vào chương trình.

Ví dụ vậy thể, bạn có thể chuyển float với int thanh lịch string như lịch trình sau. Lưu giữ ý bọn họ sử dụng cho tới hàm typeid.name() để kiểm tra kiểu của dữ liệu trước cùng sau lúc thay đổi bằng hàm template.

#include #include #include using namespace std; template string tostr(const T& t){ ostringstream os; osKết quả, hai phát triển thành a cùng b với hình dạng int cùng float vẫn được đưa sang kiểu string bởi hàm tostr như sau:

Kieu cua a: iKieu cua b: fKieu rứa doi cua a: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEKieu chũm doi cua b: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

Chuyển int sang string trong C++ bởi hàm to_string

Để dùng hàm template sinh sống trên, bọn họ đều bắt buộc khai báo template ở đầu mỗi chương trình, với chuyện này thiệt là xuề xòa phải ko nào?

Đó là tại sao mà tự phiên bản C++11 trở đi, tuy nhiên hành cùng rất hàm template ngơi nghỉ trên thì những nhà trở nên tân tiến C++ đã cung ứng 1 hàm mới có tác dụng tương tự nhưng lại có thể sử dụng dễ dàng hơn, đó đó là hàm to_string.

Hàm to_string là 1 trong hàm được cấp dưỡng từ phiên phiên bản C++11, có tác dụng chuyển số sang trọng string vào C++. Hàm to_string hoàn toàn có thể chuyển toàn bộ các định dạng hình trạng số như int, float, double thanh lịch string vào C++ với cú pháp dễ dàng và đơn giản và ngắn gọn.

Chúng ta áp dụng hàm to_string() vào C++ với cú pháp sau đây:

to_string(num);Trong đó num là số cần chuyển sang kiểu chuỗi string, với num có thể ở bất giao diện số nào, ví dụ như int, float, double giỏi short chẳng hạn.

Ví dụ gắng thể, bạn cũng có thể chuyển int sang trọng string trong C++ bằng hàm to_string và bình chọn kiểu trước với sau khi biến hóa bằng hàm typeid.name() như sau:

#include #include using namespace std;int main() { int a = 123; float b = 3.45; cout Kết quả, hai trở nên a với b với thứ hạng int và float sẽ được gửi sang mẫu mã string bằng hàm to_string như sau:

Kieu cua a: iKieu cua b: fKieu nạm doi cua a: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEKieu thế doi cua b: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

*
Ép thứ hạng Int thanh lịch String trong C++

VIII. Ép dạng hình String quý phái Char trong C+

IX. Ép thứ hạng Int thanh lịch Char trong C++

X. Phân các loại Ép đẳng cấp Trong C++

Phân loại ép dạng hình trong C++

Trong C++, có hai loại ép giao diện dữ liệu:

Nới rộng lớn (widening): Là quy trình làm tròn số từ kiểu dữ liệu có kích thước nhỏ dại hơn sang đẳng cấp có kích thước lớn hơn. Kiểu biến đổi này không làm mất thông tin.Thu nhỏ bé (narrowwing): Là quá trình làm tròn số trường đoản cú kiểu tài liệu có kích cỡ lớn hơn sang kiểu có kích thước nhỏ tuổi hơn. Kiểu biến đổi này hoàn toàn có thể làm mất thông tin

1. Nới rộng (widening)

*
Phân loại Ép giao diện Trong C++

Nới rộng lớn (widening): Là quá trình làm tròn số từ kiểu dữ liệu có kích thước nhỏ hơn sang thứ hạng có kích thước lớn hơn. Kiểu chuyển đổi này không làm mất thông tin. Ví dụ đưa từ int quý phái float. Chuyển kiểu loại này có thế được triển khai ngầm định bởi vì trình biên dịch.

Xem thêm: Khi Nào Liên Quân Reset Rank Mùa 21

Ví dụ:

#include using namespace std; int main() { int i = 100; long l = i; // khong yeu cau bỏ ra dinh ep kieu float f = l; // khong yeu cau đưa ra dinh ep kieu cout Kết quả:

Giá trị Int: 100Giá trị Long: 100Giá trị Float: 1002.Thu hẹp (narrowwing)

*
Phân nhiều loại Ép mẫu mã Trong C++

Thu thon (narrowwing): Là quy trình làm tròn số từ kiểu tài liệu có kích cỡ lớn rộng sang kiểu có kích thước nhỏ dại hơn. Kiểu chuyển đổi này rất có thể làm mất thông tin như ví dụ sinh hoạt trên. Chuyển kiểu loại này không thể thực hiện ngầm định vị trình biên dịch, người tiêu dùng phải tiến hành chuyển đẳng cấp tường minh.

Ví dụ:

#include using namespace std; int main() { double d = 100.04; long l = (long) d; // yeu cau đưa ra dinh kieu du lieu (long) int i = (int) l; // yeu cau chi dinh kieu du lieu (int) cout Kết quả: