É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ì
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
















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!!!
Của bạn đây
Bạn down tại đây nhé
http://upload.vui360.com/mirror1/download.php?file=2f753863ce1e0c926a3dab7cf1c75767 
Tất cả những vấn đề về ép kiểu mình đã trình bày ở trên rồi