Ép kiểu trong C++

Ép các kiểu có sẵn trong C++: int, float, long, double… cái này dễ chẳng nói làm gì :d

Mỗi class (lớp) có thể được xem như một kiểu dữ liệu mới, trong khi tính toán đôi khi chúng ta cần phải ép kiểu từ một lớp về các kiểu có sẵn. Ví dụ như chúng ta xây dựng lớp SOTHUC (số thực) chẳng hạn với các phép toán “cộng”, “trừ”, “nhân”, “chia” rõ ràng chúng ta không thể thực hiện các phép toán vừa xây xựng giữa kiểu SOTHUC với các kiểu có sẵn như int, float,… để làm được điều này chúng ta có 2 cách: nạp chồng thêm các toán tử để cộng kiểu SOTHUC với các kiểu có sẵn, hoặc “ép kiểu” class SOTHUC (số thực) về kiểu int, float… để thực hiện tính toán.

Để ép kiểu với class: Ép từ class về 1 kiểu có sẵn hoặc ép từ 1 kiểu có sẵn về class với trình biên dịch của Dev-C++ ta làm như sau:

 – Ép từ class về 1 kiểu có sẵn:

class <tên lớp>
{
   <kiểu dữ liệu> tênbiến;
   public:
            …
            operator <kiểu dữ liệu có sẵn>()
            {
                   ….
                   return <Giá trị có kiểu dữ liệu cần chuyển về>;
            }
}

Sử dụng như sau:

 <tên lớp> ex;//đối tượng ex thuộc lớp đã khai báo

bây giờ cần ép đối tượng ex về 1 kiểu có sẵn trong C++ ta dùng như sau:

<kiểu dữ liệu có sẵn> ex1;

ex1=<kiểu dữ liệu có sẵn> (ex);/*thực hiện ép kiểu của ex về <kiểu dữ liệu có sẵn>(chính là kiểu của ex1) sau đó gán cho ex1*/
Hoặc dùng
ex1=ex; /*Chương trình sẽ tự động ép kiểu của ex về <kiểu dữ liệu có sẵn>(chính là kiểu của ex1) sau đó gán cho ex1*/

Để dễ hiểu hơn, xem ví dụ sau:

Giả sử ta xây dựng 1 lớp số nguyên lớn như sau:

class largeInt
{
   char *value;
   public:
          largeInt();
          largeInt(const largeInt & );
          ~largeInt();  
          friend istream &operator>>(istream &, largeInt & );
          friend ostream &operator<<(ostream &, const largeInt & );
          largeInt operator+(const largeInt & );
          largeInt operator-(const largeInt & );
          largeInt operator-();
          largeInt operator*(const char & );
          largeInt operator*(const largeInt & );
          largeInt operator/(const largeInt & );
          operator int();//ep sang kieu int
};

các toán tử +,-,*,/ mà ta đã nạp chồng chỉ sử dụng đc cho 2 đối tượng của cùng lớp largeInt:

Khi chưa có toán tử ép kiểu:

largeInt x1,x2,x; cin>>x1>>x2; int y,y1;
x=x1+x2;// thực hiện được
y=x1; //không thực hiện được
y=x1+9; //không thực hiện được
y=9+x1; //không thực hiện được
x=y1; //không thực hiện được

Khi đã có toán tử ép kiểu:

largeInt x1,x2,x; cin>>x1>>x2; int y,y1;
x=x1+x2; //thực hiện được
y=x1; //thực hiện được chương trình sẽ tự động ép kiểu x1 về int
y=x1+9; /*không thực hiện được, để thực hiện đc cần ép kiểu của x1 về int: y=int(x1)+9 */
y=9+x1;/* Cái này thì thực hiện được, chương trình tự động ép kiểu của x1 về int*/
x=y1; //vẫn không thực hiện được

– Ép từ 1 kiểu có sẵn về một class(lớp) chính là kiểu dữ liệu mà ta định nghĩa:

C++ không cho phép định nghĩa thêm toán tử mới vì vậy ta không thể áp dụng cách trên để ép kiểu cho trường hợp này:

Cách khai báo:

class largeInt
{
   char *value;
   public:
          …
          operator int();//ep sang kieu int
          operator largeInt(); //Không hợp lệ         
};

Là không hợp lệ và bị lỗi ở operator largeInt();

Vậy phải làm sao để ép một kiểu dữ liệu sẵn có về một lớp? Chúng ta có hai cách: Dùng hàm bạn(friend) để ép kiểu và dùng hàm tạo (constructor) để ép kiểu. Nếu dùng hàm bạn để ép kiểu thì tên hàm không được trùng với tên lớp, đây là điểm yếu của cách này, giả sử trong lớp số nguyên lớn(largeInt) ở trên, để ép một số x thuộc kiểu int về kiểu largeInt chúng ta chỉ có thể sử dụng largeint(x), convertToLargeInt(x)… chứ không thể sử dụng largeInt(x), thật bất tiện. Vì vậy chúng ta sử dụng constructor để ép kiểu, cách khai báo như sau:

class <tên lớp>
{
   <kiểu dữ liệu> tênbiến;
   public:
            …
            <tên lớp>(<kiểu dữ liệu có sẵn> ) 
              {
                      cout<<“ép kiểu dữ liệu có sẵn về kiểu lớp”;
              }
}

Quay trở lại ví dụ về lớp số nguyên lớn ở trên ta thấy

Khi chưa có constructor “ép kiểu”

largeInt x1,x2,x; int y,y1;

x=y1; // không thực hiện được

Khi đã có constructor “ép kiểu”

largeInt x1,x2,x; int y,y1;

x=y1; // Thực hiện được, chương trình tự động ép kiểu int về largeInt

Lưu ý: constructor chỉ tự động ép kiểu trong khi gán, vì vậy

largeInt x1,x2,x; int y,y1,y2;

x=x1+y1;//không thực hiện đc
x=x1+largeInt(y1);//thực hiện được
x=y1+x1;/* thực hiện được, tự động ép x1 về int, tính tổng, tự động ép kết quả sang largeInt và gán cho x*/
x=y1+y2;//thực hiện được

13 Responses

  1. hihipro viết:

    mình đang làm bài tập liên quan đến số nguyên lớn này, nhưng không bjt phai sử lý ntn, bạn có thể cho mình đoạn code SỐ NGUYÊN LỚN được không!!!
    Thanks so much!!! (*) (*) (*)

  2. As viết:

    #:-s Lâu lắm rồi, chẳng nhớ vứt đâu. Tìm mãi mới thấy :d
    Của bạn đây :-)

  3. Rocket80 viết:

    :l Bạn ơi, mình cũng mún xin bài số nguyên lớn, mà hình như link die rồi hay sao đó, không down được ^:)^

  4. rocket80 viết:

    bạn AS ơi, mình đang nghiên cứu về toán tử chuyển kiểu, mà mình tìm trên google thấy rât ít tài liệu về vấn đề này, bạn có thể cho mình tham khảo ít ý kiến hay không, cám ơn bạn nhiều nha :-p

  5. luân viết:

    bạn cho mình hỏi. mình đag làm về số nguyên dài. vậy mình phải khai báo mảng là j? mà ép kiểu j để tính đc tổng các dãy số nguyên dai đó.

  6. Bich viết:

    huc, google 1 phát cái ép kiểu trong C++ lại thấy cái trang của sư thúc đầu tiên chứ, nổi tiếng rồi đấy =))

  7. Bich viết:

    Chac la tai cai title hot, st them cai chuc nang remember name + email cua 1 cai ip truy vao trang nay di. moi lan cm lai phai go lai cai kia a

  8. Bich viết:

    Có thấy đâu nhỉ :-??

Trả lời

© 2010-2013 As247 Blog. All Rights Reserved. 0,401