01/10/2018, 10:09
Chuyển kiểu tự động của trình biên dịch trong C++
Mình có đoạn header như sau:
class PhanSo{
private:
int ts, ms;
public:
PhanSo (int ts=0, int ms=1);
PhanSo operator +(PhanSo);
};
Và các dòng lệnh sau:
PhanSo a, b(3, 4), c(2, 5);
a = b + c;
a = b + 3;
a = 3 + c;
Cho mình hỏi tại sao ở dòng thứ 3 thì số ‘3’ được chuyển kiểu tự động từ int sang PhanSo, còn ở dòng cuối cùng thì không ?
Bài liên quan
No implicit conversion in overloaded operator
trong C++
x + y
được dịch theo 2 kiểu:x.operator+(y)
operator+(x, y)
ở đây ko có kiểu 2, nên nó dịch theo kiểu 1, mà trong C++ khi gọi
operator.
trongx.
thìx
ko được chuyển kiểu tự động. Lý do là vì nếux
chuyển kiểu tự động được thì trình dịch phải kiểm tra tất cả các kiểu trong C++, ví dụ int -> float, int -> long int, int -> double, v.v… rồi chưa kể tớiy
nữa, nếux
có thể chuyển ngầm thành 100 kiểu, mỗi kiểux
lại có 100 kiểu choy
thì chuyển ngầm thử 10000 lần… làm vậy thì biên dịch 1 chương trình đơn giản chắc tới tết Congo nên nó ko làm.y
có thể chuyển ngầm được vì class củax
đã được xác định, số lượng hàm cần kiểm thử chuyển kiểu tự động choy
là nhỏ, ví dụ chỉ khoảng 100 kiểu hoặc 1 2 kiểu.bạn muốn dòng cuối compile được thì định nghĩa 1 cái free function, xài friend hoặc tạo thêm 2 hàm lấy tử số, mẫu số cho
PhanSo
là được:sở dĩ ở đây
x
được chuyển ngầm vì số lượng free function chooperator+
chỉ có tăng 1 chiều chứ ko tăng 2 chiều x y nhưx.operator+(y)
kia nên chuyển ngầm thoải máiCảm ơn bạn rất nhiều.