You are on page 1of 71

Chuong 2 Chuong 2

Dnh nghu phop toun Dnh nghu phop toun


1
Dnh nghu phop toun Dnh nghu phop toun
Ni dung Ni dung
l. Mo duo
2. Hum phop toun
3. Choyon koo
4. Cun vu kho dong
5. Cuc phop toun thong dong
2
5. Cuc phop toun thong dong
1 Mo au 1 Mo au
1rong C++, cuc koo do oo no tu |bot-n dutu typos):
nt, ong, lout, doobo, chur cong vo cuc phop toun +,-
,*,/ cong cup mot cu dut co tho cou khu nom trong tho
go thoc. Cuc phop toun nho tron cho phop ngoo so dong
toong tuc vo choong trnh thoo mot guo don to nhon ton
o.
Ngoo so dong co tho co nho cuo tuo cuc koo do oo mo
3
Ngoo so dong co tho co nho cuo tuo cuc koo do oo mo
mu ngon ngo khong cong cup nho mu trun, du thoc, so
phoc, voctor...
Lop trong C++ cong cup mot phoong ton do qo dnh vu
boo don cuc ou do toong nho tron. Dong tho tuo khu
nung dnh nghu phop toun cho koo do oo mo, nho do
ngoo so dong co tho thuo tuc tron koo do oo mo dnh
nghu thoo mot guo don thun thon toong to nho koo co
sun.
Mo au Mo au
Mot phop toun u mot ky hoo mu no thuo tuc tron do
oo, do oo dooc thuo tuc dooc go u toun hung, bun
thun ky hoo dooc go u phop toun.
lhop toun co hu toun hung dooc go u phop toun hu
ngo |nh phun), ch co mot toun hung dooc go u phop
toun mot ngo |don phun).
Suo kh dnh nghu phop toun cho mot koo do oo mo,
4
Suo kh dnh nghu phop toun cho mot koo do oo mo,
tu co tho so dong no mot cuch thun thon. V do:
SoPhuc z(1,3), z1(2,3.4), z2(5.1,4);
z = z1 + z2;
z = z1 + z2*z1 + SoPhuc(3,1);
2 Ham phep toan 2 Ham phep toan
un chut cou phop toun u unh xu, v vuy dnh nghu
phop toun u nh ngha ham. 1ut cu cuc phop toun co
trong C++ doo co tho dooc dnh nghu.
+ - * / % ^ & | ~ !
= < > += -= *= /= %= ^= &=
|= << >> <<= >>= == != <= >= &&
|| ++ -- ->* , -> [] () new delete
5
|| ++ -- ->* , -> [] () new delete
1u dnh nghu phop toun bung hum co ton duc bot but
duo bung to khou oporutor thoo suo bo ky hoo phop
toun cun dnh nghu.
V du minh hoa Lp PhanSo V du minh hoa Lp PhanSo
typedef int bool;
typedef int Item;
const bool false = 0, true = 1;
long USCLN(long x, long y)
{
long r;
x = abs(x); y = abs(y);
6
x = abs(x); y = abs(y);
if (x == 0 || y == 0) return 1;
while ((r = x % y) != 0)
{
x = y;
y = r;
}
return y;
}
V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo
class PhanSo
{
long tu, mau;
void UocLuoc();
public:
PhanSo(long t, long m) {Set(t,m);}
void Set(long t, long m);
long LayTu() const {return tu;}
long LayMau() const {return mau;}
7
long LayMau() const {return mau;}
PhanSo Cong(PhanSo b) const;
PhanSo operator + (PhanSo b) const;
PhanSo operator - () const {return PhanSo(-tu,
mau);}
bool operator == (PhanSo b) const;
bool operator != (PhanSo b) const;
void Xuat() const;
};
V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo
void PhanSo::UocLuoc()
{
long usc = USCLN(tu, mau);
tu /= usc; mau /= usc;
if (mau < 0)
mau = -mau, tu = -tu;
if (tu == 0) mau = 1;
8
if (tu == 0) mau = 1;
}
V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo
void PhanSo::Set(long t, long m)
{
if (m)
{
tu = t;
mau = m;
UocLuoc();
}
9
}
}
void PhanSo::Xuat() const
{
cout << tu;
if (tu != 0 && mau != 1)
cout << "/" << mau;
}
V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo
PhanSo PhanSo::Cong(PhanSo b) const
{
return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau);
}
PhanSo PhanSo::operator + (PhanSo b) const
{
return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau);
10
return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau);
}
bool PhanSo::operator == (PhanSo b) const
{
return tu*b.mau == mau*b.tu;
}
V du minh hoa Lop PhanSo V du minh hoa Lop PhanSo
Suo kh dnh nghu phop toun, tu co tho dong thoo guo
don to nhon:
void main()
{
PhanSo a(2,3), b(3,4), c(0,1),d(0,1);
c = a.Cong(b);
d = a + b; // d = a.operator + (b);
11
d = a + b; // d = a.operator + (b);
cout << "c = "; c.Xuat(); cout << "\n";
cout << "d = "; d.Xuat(); cout << "\n";
cout << "c == d = " << (c == d) << "\n";
cout << "c != d = " << (c != d) << "\n";
(-a).Xuat(); // (a.operator ()).Xuat();
}
Mot so rang buoc cua phep toan Mot so rang buoc cua phep toan
Kh dnh nghu phop toun th khong dooc thuy do cuc
duc tnh muc nhon cou phop toun nho do oo ton, so
ngo: khong dooc sung cho phop toun mo nho mod,
**,
Huo hot cuc phop toun khong rung booc y nghu, ch mot
so troong hop cu bot nho phop toun gun |operator =),
uy phun to qou ch so |operator []), phop go hum
12
uy phun to qou ch so |operator []), phop go hum
|operator ()), vu phop uy thunh phun |operator -
>) do ho phu dooc dnh nghu u hum thunh phun do
toun hung tho nhut co tho u mot do toong tru
|lvalue).
Cuc phop toun co sun co co cho kot hop dooc soy don to
cuc phop toun thunh phun, v do:
a += b; // a = (a+b);
a *= b; // a = (a*b);
Mot so rang buoc cua phep toan Mot so rang buoc cua phep toan
Doo tron khong dong do phop toun dnh nghu cho cuc
koo do oo do ngoo so dong dnh nghu. Nghu u tu
phu cho dong dnh nghu phop toun +=, -=, *=,
>>=, do du dnh nghu phop gun vu cuc phop toun
+,-,*,>>,
kung booc tron cho phop ngoo so dong cho dong dnh
nghu phop toun nuo trooc |+= trooc huy + trooc).
13
nghu phop toun nuo trooc |+= trooc huy + trooc).
Ham thanh phan va toan cuc Ham thanh phan va toan cuc
1rong v do tron, tu dnh nghu hum thunh phun co ton
duc bot but duo bung to khou oporutor thoo suo bo ton
phop toun cun dnh nghu. Suo kh dnh nghu phop
toun, tu co tho dong thoo guo don to nhon:
void main()
{
PhanSo a(2,3), b(3,4), c(0,1),d(0,1);
14
PhanSo a(2,3), b(3,4), c(0,1),d(0,1);
c = a.Cong(b);
d = a + b; // d = a.operator + (b);
cout << "c = "; c.Xuat(); cout << "\n";
cout << "d = "; d.Xuat(); cout << "\n";
cout << "c == d = " << (c == d) << "\n";
cout << "c != d = " << (c != d) << "\n";
(-a).Xuat(); // (a.operator ()).Xuat();
}
Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc
1rong huo hot cuc troong hop, tu co tho dnh nghu phop
toun bung thunh phun houc dong hum toun coc.
Kh dnh nghu phop toun bung hum thunh phun, so thum so
t hon so ngo mot v du co mot thum so ngum dnh u do
toong go phop toun |toun hung tho nhut). lhop toun 2 ngo
cun l thum so vu phop toun l ngo khong co thum so:
a - b;// a.operator -(b);
15
a - b;// a.operator -(b);
-a; // a.operator ();
Kh dnh nghu phop toun bung hum toun coc, so thum so
bung so ngo, lhop toun 2 ngo cun 2 thum so vu phop toun
mot ngo cun mot thum so:
a - b;// operator -(a,b);
-a; // a.operator ();
Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc
class PhanSo
{
long tu, mau;
void UocLuoc();
public:
PhanSo(long t, long m) {Set(t,m);}
void Set(long t, long m);
16
long LayTu() const {return tu;}
long LayMau() const {return mau;}
PhanSo operator + (PhanSo b) const;
friend PhanSo operator - (PhanSo a, PhanSo b);
PhanSo operator -() const {return PhanSo(-tu,
mau);}
bool operator == (PhanSo b) const;
bool operator != (PhanSo b) const;
void Xuat() const;
};
Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc
PhanSo PhanSo::operator + (PhanSo b) const
{
return PhanSo(tu*b.mau + mau*b.tu, mau*b.mau);
}
PhanSo operator - (PhanSo a, PhanSo b)
{
return PhanSo(a.tu*b.mau - a.mau*b.tu,
17
return PhanSo(a.tu*b.mau - a.mau*b.tu,
a.mau*b.mau);
}
Ham thanh phan va ham toan cuc Ham thanh phan va ham toan cuc
void main()
{
PhanSo a(2,3), b(3,4), c(0,1),d(0,1);
c = a + b; // d = a.operator + (b);
d = a - b; // d = operator - (a,b);
cout << "c = "; c.Xuat(); cout << "\n";
cout << "d = "; d.Xuat(); cout << "\n";
18
cout << "d = "; d.Xuat(); cout << "\n";
}
Ham thanh phan va toan cuc Ham thanh phan va toan cuc
Kh co tho dnh nghu bung hu cuch, dong hum thunh
phun so gon hon. 1oy nhon chon hum thunh phun huy
hum toun coc houn toun toy thoo so thch cou ngoo so
dong.
Dong hum toun coc thoun ton hon kh tu co nho cuo
choyon koo o toun hung tho nhut.
Cuc phop toun =, [], (), -> nho du no tron but
19
Cuc phop toun =, [], (), -> nho du no tron but
booc phu dooc dnh nghu u hum thunh phun v toun
hung tho nhut phu u lvalue.
Kh dnh nghu phop toun co toun hung tho nhut thooc
op dung xot th co tho dong hum thunh phun houc hum
toun coc.
1oy nhon, noo toun hung tho nhut khong thooc op dung
xot th phu dnh nghu bung hum toun coc |Xom v do).
1roong hop thong dong u dnh nghu phop toun << vu
>>.
V du su dung ham toan cuc V du su dung ham toan cuc
class PhanSo
{
long tu, mau;
public:
PhanSo(long t, long m) {Set(t,m);}
PhanSo operator + (PhanSo b) const;
PhanSo operator + (long b) const
20
PhanSo operator + (long b) const
{return PhanSo(tu + b*mau, mau);}
void Xuat() const;
};
PhanSo a(2,3), b(4,1);
a + b; // a.operator + (b): Ok
a + 5; // a.operator + (5): Ok
3 + a; // 3.operator + (a): SAI
V du su dung ham toan cuc V du su dung ham toan cuc
class PhanSo
{
long tu, mau;
public:
PhanSo(long t, long m) {Set(t,m);}
PhanSo operator + (PhanSo b) const;
PhanSo operator + (long b) const;
{return PhanSo(tu + b*mau, mau);}
friend PhanSo operator + (long a, PhanSo b);
21
friend PhanSo operator + (long a, PhanSo b);
};
PhanSo operator + (long a, PhanSo b)
{ return PhanSo(a*b.mau+b.tu, b.mau); }
//...
PhanSo a(2,3), b(4,1), c(0,1);
c = a + b; // a.operator + (b): Ok
c = a + 5; // a.operator + (5): Ok
c = 3 + a; // operator + (3,a): Ok
3 Chuyen kieu (type conversions) 3 Chuyen kieu (type conversions)
Vo mut khu nom, tu co tho thoc hon tron un phun so
vu so ngoyon trong cuc phop toun so hoc vu qoun ho.
Chung hun co tho cong phun so vu phun so, phun so vu
so ngoyon, so ngoyon vu phun so. Doo do cong dong
cho cuc phop toun khuc nho tro, nhun, chu, so sunh.
Nghu u tu co nho cuo dnh nghu phop toun +,-
,*,/,<,>,==,!=,<=,>= cho phun so vu so ngoyon.
22
,*,/,<,>,==,!=,<=,>= cho phun so vu so ngoyon.
So dong cuch dnh nghu cuc hum nho tron cho phop
toun + vu um toong to cho cuc phop toun con u tu co
tho thuo tuc tron phun so vu so ngoyon.
Doo do cong up dong toong to cho cuc koo do oo
khuc do ngoo so dong dnh nghu.
Chuyen kieu Chuyen kieu
class PhanSo
{
long tu, mau;
public:
PhanSo(long t, long m) {Set(t,m);}
void Set(long t, long m);
PhanSo operator + (PhanSo b) const;
PhanSo operator + (long b) const;
friend PhanSo operator + (long a, PhanSo b);
PhanSo operator - (PhanSo b) const;
23
PhanSo operator - (PhanSo b) const;
PhanSo operator - (long b) const;
friend PhanSo operator - (long a, PhanSo b);
PhanSo operator * (PhanSo b) const;
PhanSo operator * (long b) const;
friend PhanSo operator * (long a, PhanSo b);
PhanSo operator / (PhanSo b) const;
PhanSo operator / (long b) const;
// con tiep trang sau
};
Chuyen kieu Chuyen kieu
// tiep theo
friend PhanSo operator / (int a, PhanSo b);
PhanSo operator -() const;
bool operator == (PhanSo b) const;
bool operator == (long b) const;
friend bool operator == (long a, PhanSo b);
bool operator != (PhanSo b) const;
24
bool operator != (long b) const;
friend bool operator != (int a, PhanSo b);
bool operator < (PhanSo b) const;
bool operator < (long b) const;
friend bool operator < (int a, PhanSo b);
bool operator > (PhanSo b) const;
bool operator > (long b) const;
friend bool operator > (int a, PhanSo b);
bool operator <= (PhanSo b) const;
//...
Chuyen kieu Chuyen kieu
Vo cuc khu buo nho tron, tu co tho so dong phun so vu
so ngoyon un on trong mot boo thoc:
void main()
{
PhanSo a(2,3), b(1,4), c(3,1), d(2,5);
a = b * -c;
c = (b+2) * 2/a;
25
c = (b+2) * 2/a;
d = a/3 + (b*c-2)/5;
}
1oy nhon, vot cuc hum toong to nhuo up d up u u
cuch top guy mot mo vu do su sot. 1u tho hoc thoo
cuch choyon koo ngum dnh mu C++ up dong cho cuc
koo do oo co sun:
double r = 2; // double x = double(2);
double s = r + 3; // double s = r + double(3);
cout << sqrt(9); // cout << sqrt(double(9));
3.1 Chuyen kieu bang phuong thuc thiet Iap 3.1 Chuyen kieu bang phuong thuc thiet Iap
Kh cun tnh toun mot boo thoc, noo koo do oo chou
houn toun khop, trnh bon dch so tm cuch choyon koo.
1rong mot boo thoc so hoc, noo co so thum gu cou mot
toun hung thoc, cuc thunh phun khuc so dooc choyon
sung so thoc. Cuc troong hop khuc choyon koo dooc thoc
hon thoo ngoyon tuc nung cup |nt sung ong, lout sung
doobo ). 1u co tho hoc thoo cuch choyon koo to so
ngoyon sung so thoc do choyon to so ngoyon sung phun
26
doobo ). 1u co tho hoc thoo cuch choyon koo to so
ngoyon sung so thoc do choyon to so ngoyon sung phun
so.
So ngoyon co tho choyon sung so thoc mot cuch ngum
dnh kh cun v co tho tuo dooc mot so thoc to so ngoyon.
double r = 2; // double r = double(2);
Do co tho choyon to so ngoyon sung phun so, tu cun duy
trnh bon dch cuch tuo phun so to so ngoyon.
PhanSo a = 3; // PhanSo a = PhanSo(3);
// Hay PhanSo a(3);
Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap
Voc tuo phun so to so ngoyon chnh u phop go phoong
thoc thot up. No cuch khuc tu cun xuy dong mot
phoong thoc thot up do tuo mot phun so vo thum so u
so ngoyon:
class PhanSo
{
long tu, mau;
27
long tu, mau;
public:
PhanSo(long t, long m) {Set(t,m);}
PhanSo(long t) {Set(t,1);} // Co the chuyen
kieu tu so nguyen sang phan so
void Set(long t, long m);
PhanSo operator + (PhanSo b) const;
friend PhanSo operator + (int a, PhanSo b);
PhanSo operator - (PhanSo b) const;
friend PhanSo operator - (int a, PhanSo b);
Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap
lhoong thoc thot up vo mot thum so u so ngoyon nho
tron hum y rung mot so ngoyon la mot phun so, co tho
choyon koo ngum dnh to so ngoyon sung phun so.
Kh do tu co tho gum bot voc khu buo vu dnh nghu
phop toun + phun so vu so ngoyon, co cho choyon koo to
dong cho phop thoc hon thuo tuc cong do, no cuch
khuc co tho gum voc dnh nghu 3 phop toun xoong con
28
khuc co tho gum voc dnh nghu 3 phop toun xoong con
2:
//...
PhanSo a(2,3), b(4,1), c(0);
PhanSo d = 5; // PhanSo d = PhanSo(5);
// PhanSo d(5);
c = a + b; // c = a.operator + (b): Ok
c = a + 5; // c = a.operator + (PhanSo(5)): Ok
c = 3 + a; // c = operator + (3,a): Ok
Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap
1u co tho gum so phop toun cun dnh nghu to 3 xoong l
bung cuch dong hum toun coc, kh do co tho choyon koo
cu hu toun hung.
class PhanSo
{
long tu, mau;
public:
29
public:
PhanSo(long t, long m) {Set(t,m);}
PhanSo(long t) {Set(t,1);} // Co the chuyen
kieu tu so nguyen sang phan so
void Set(long t, long m);
friend PhanSo operator + (PhanSo a, PhanSo b);
friend PhanSo operator - (PhanSo a, PhanSo b);
//...
};
Chuyen kieu bang phuong thuc thiet Iap Chuyen kieu bang phuong thuc thiet Iap
Kh do co cho choyon koo co tho dooc thoc hon cho cu
hu toun hung.
//...
PhanSo a(2,3), b(4,1), c(0);
PhanSo d = 5; // PhanSo d = PhanSo(5);
c = a + b; // c = operator + (a,b): Ok
c = a + 5; // c = operator + (a,PhanSo(5)): Ok
30
c = a + 5; // c = operator + (a,PhanSo(5)): Ok
// Hay c = a + PhanSo(5);
c = 3 + a; // c = operator + (PhanSo(3),a): Ok
// Hay c = PhanSo(3) + a
|:) Noo vot
c = 5 + 7;
1h co tho choyon koo cu hu toun hung dooc khong:
// c = PhanSo operator + (PhanSo(5), PhanSo(7));
Hai cach chuyen kieu bang phuong thuc thiet Iap Hai cach chuyen kieu bang phuong thuc thiet Iap
Choyon koo bung phoong thoc thot up dooc thoc hon
thoo ngoyon tuc co tho tuo mot do toong mo |phun so)
to mot do toong du co |so ngoyon). Doo do co tho dooc
thoc hon thoo cuch noo tron, houc dong phoong thoc
thot up vo thum so co gu tr muc nhon.
class PhanSo
{
class PhanSo
{
31
{
long tu, mau;
public:
PhanSo(long t, long m)
{Set(t,m);}
PhanSo(long t)
{Set(t,1);}
//...
};
{
long tu, mau;
public:
PhanSo(long t, long m
= 1) {Set(t,m);}
//...
};
Khi nao chuyen kieu bang phuong thuc thiet Iap Khi nao chuyen kieu bang phuong thuc thiet Iap
1u dong choyon koo bung phoong thoc thot up kh
thou hu doo kon suo:
l. Choyon to koo du co |so ngoyon) sung koo dung dnh
nghu |phun so).
2. Co qoun ho u mot to koo du co sung koo dung dnh nghu
|mot so ngoyon la mot phun so).
Cuc v do dong choyon koo bung phoong thoc thot up
32
Cuc v do dong choyon koo bung phoong thoc thot up
buo gom: Choyon to so thoc sung so phoc, chur * sung
Strng, so thoc sung dom trong mut phung.
3.2 Chuyen kieu bang phep toan chuyen kieu 3.2 Chuyen kieu bang phep toan chuyen kieu
So dong phoong thoc thot up do choyon koo nho tron
ton o trong mot so troong hop nhong no cong co mot
so nhooc dom:
1. Muon chuyen t kieu ang nh ngha sang mot kieu a co, ta
phai sa oi kieu a co.
2. Khong the chuyen t kieu ang nh ngha sang kieu c ban co
san.
33
san.
3. Phng thc thiet lap vi mot tham so se dan en c che chuyen
kieu t ong co the khong mong muon.
Cuc nhooc dom tron co tho dooc khuc phoc bung cuch
dnh nghu phop toun choyon koo.
lhop toun choyon koo u hum thunh phun co dung
X::operator T()
Vo phop toun tron, so co co cho choyon koo to dong
to koo dung dooc dnh nghu X sung koo du co 1.
Dung phep toan chuyen kieu Dung phep toan chuyen kieu
1u dong phop toun choyon koo kh dnh nghu koo mo vu moon tun
dong cuc phop toun cou koo du co.
class String
{
char *p;
public:
String(char *s = "") {p = strdup(s);}
String(const String &s2) {p = strdup(s2.p);}
34
String(const String &s2) {p = strdup(s2.p);}
~String() {delete [] p;}
String& operator = (const String& p2);
int Length() const {return strlen(p);}
void ToUpper() {strupr(p);}
friend ostream& operator << (ostream &o, const
String& s);
operator const char *() const {return p;}
operator char *() const {return p;}
};
Dung phep toan chuyen kieu Dung phep toan chuyen kieu
ostream & operator << (ostream &o, const String& s)
{
return o << s.p;
}
void main()
{
String s("Nguyen van A");
35
cout << s.Length() << "\n";
cout << strlen(s) << "\n";
if (strcmp(s, "Nguyen van A") == 0)
cout << "Hai chuoi bang nhau\n";
else
cout << "Hai chuoi khac nhau\n";
strupr(s);
cout << s << "\n";
}
V du ve phep toan chuyen kieu V du ve phep toan chuyen kieu
V do suo mnh hou ro thom nho cuo choyon koo. Mot
NomStr co tho choyon sung so thoc.
class NumStr
{
char *s;
public:
NumStr(char *p) {s = dupstr(p);}
36
NumStr(char *p) {s = dupstr(p);}
operator double() {return atof(s);}
friend ostream & operator << (ostream &o,
NumStr &ns);
};
ostream & operator << (ostream &o, NumStr &ns)
{
return o << ns.s;
}
V du ve phep toan chuyen kieu V du ve phep toan chuyen kieu
void main()
{
NumStr s1("123.45"), s2("34.12");
cout << "s1 = " << s1 << "\n";
// Xuat 's1 = 123.45' ra cout
cout << "s2 = " << s2 << "\n";
// Xuat 's2 = 34.12' ra cout
37
// Xuat 's2 = 34.12' ra cout
cout << "s1 + s2 = " << s1 + s2 << "\n";
// Xuat 's1 + s2 = 157.57' ra cout
cout << "s1 + 50 = " << s1 + 50 << "\n";
// Xuat 's1 + 50 = 173.45' ra cout
cout << "s1 * 2 = " << s1 * 2 << "\n";
// Xuat 's1 * 2 = 246.9' ra cout
cout << "s1 / 2 = " << s1 / 2 << "\n";
// Xuat 's1 / 2 = 61.725' ra cout
}
Dung phep toan chuyen kieu Dung phep toan chuyen kieu
lhop toun choyon koo cong dooc dong do boo don qoun ho u mot
to koo dung dnh nghu sung koo du co.
class PhanSo
{
long tu, mau;
void UocLuoc();
public:
PhanSo(long t = 0, long m = 1) {Set(t,m);}
void Set(long t, long m);
38
friend PhanSo operator + (PhanSo a, Pham So b);
void Xuat() const;
operator double() const {return double(tu)/mau;}
};
//...
PhanSo a(9,4);
cout << sqrt(a) << \n;
// cout << sqrt(a.operator double()) << \n;
4. Mot so phep toan thong dung 4. Mot so phep toan thong dung
Mot so phop toun dooc C++ dnh nghu u vo y nghu
mo. V do << vu >> u hu phop toun dooc C++ dnh
nghu u do so dong vo cuc dong xout, nhup up dong
cho cuc koo co bun.
1u cong co tho dnh nghu u << vu >> do thoc hon
cuc thuo tuc xout nhup cho cuc koo do oo mo.
Ngou ru, voc dnh nghu cuc phop toun thong dong
39
Ngou ru, voc dnh nghu cuc phop toun thong dong
khuc nho ||, |), ++, cho cuc koo do oo mo so um
cho op tro non do so dong hon, vo guo don thun thon
nho cuc koo du co.
5.1 Phep toan << va >> 5.1 Phep toan << va >>
<< vu >> u hu phop toun thuo tuc tron tong bt kh cuc
toun hung u so ngoyon.
C++ dnh nghu u hu phop toun do dong vo cuc do
toong thooc op ostroum vu stroum do thoc hon cuc thuo
tuc xout, nhup.
Kh dnh nghu hu phop toun tron, cun tho hon y nghu
suo:
40
suo:
a >> b; // bo a vao b
a << b; // bo b vao a
cout << a << \n; // bo a va \n vao cout
cin >> a >> b; // bo cin vao a va b
Lop ostroum |dong do oo xout) dnh nghu phop toun <<
up dong cho cuc koo do oo co bun |ngoyon, thoc, chur
*,).
Lop stroum |dong do oo nhup) dnh nghu phop toun >>
up dong cho cuc koo do oo co bun |ngoyon, thoc, chur
Phep toan << va >> Phep toan << va >>
coot, corr u cuc bon thooc op ostroum du don cho
thot b xout choun |muc nhon u mun hnh) vu thot b
buo o choun |oon oon u mun hnh).
cn u mot do toong thooc op stroum du don cho thot
b nhup choun, muc nhon u bun phm.
Vo khu buo cou op ostroum nho tron tu co tho thoc hon
phop toun << vo toun hung tho nhut u mot dong do oo
41
phop toun << vo toun hung tho nhut u mot dong do oo
xout |coot, coor, tup tn), toun hung tho hu thooc cuc
koo co bun |ngoyon, thoc, chur *, con tro).
1oong to, tu co tho up dong phop toun >> vo toun hung
tho nhut thooc op stroum |v do cn), toun hung tho hu
u thum choo don koo co bun houc con tro |ngoyon,
thoc, chur *).
Lop ostream Lop ostream
class ostream : virtual public ios
{
public:
// Formatted insertion operations
ostream & operator<< ( signed char);
ostream & operator<< (unsigned char);
ostream & operator<< (int);
42
ostream & operator<< (unsigned int);
ostream & operator<< (long);
ostream & operator<< (unsigned long);
ostream & operator<< (float);
ostream & operator<< (double);
ostream & operator<< (const signed char *);
ostream & operator<< (const unsigned char *);
ostream & operator<< (void *);
// ...
private:
Lop istream Lop istream
class istream : virtual public ios
{
public:
istream & getline(char *, int, char = '\n');
istream & operator>> ( signed char *);
istream & operator>> (unsigned char *);
istream & operator>> (unsigned char &);
43
istream & operator>> ( signed char &);
istream & operator>> (short &);
istream & operator>> (int &);
istream & operator>> (long &);
istream & operator>> (unsigned short &);
istream & operator>> (unsigned int &);
istream & operator>> (unsigned long &);
istream & operator>> (float &);
istream & operator>> (double &);
private:
Phep toan << va >> Phep toan << va >>
Do dnh nghu phop toun << thoo nghu xout ru dong do
oo xout cho koo do oo dung dnh nghu, tu dnh nghu
phop toun nho hum toan cuc vo thum so tho nhut u
tham chieu en oi tng thuoc lp ostream, kot qou
tru vo u tham chieu en chnh ostream o. 1oun hung
tho hu thooc op dung dnh nghu.
Do dnh nghu phop toun >> thoo nghu nhup to dong
44
Do dnh nghu phop toun >> thoo nghu nhup to dong
do oo nhup cho koo do oo dung dnh nghu, tu dnh
nghu phop toun >> nho hum toan cuc vo thum so tho
nhut u tham chieu en mot oi tng thuoc lp
istream, kot qou tru vo u tham chieu en chnh istream
do. 1oun hung tho hu u tham chieu don do toong
thooc op dung dnh nghu.
1hong thoong tu khu buo hu phop toun tron u hum
bun cou op do co tho troy xout do oo troc top.
V du jnh nghia << va >> cho Iop phan so V du jnh nghia << va >> cho Iop phan so
// phanso.h
class PhanSo
{
long tu, mau;
void UocLuoc();
public:
PhanSo(long t = 0, long m = 1) {Set(t,m);}
45
void Set(long t, long m);
long LayTu() const {return tu;}
long LayMau() const {return mau;}
friend PhanSo operator + (PhanSo a, PhanSo b);
friend PhanSo operator - (PhanSo a, PhanSo b);
friend PhanSo operator * (PhanSo a, PhanSo b);
friend PhanSo operator / (PhanSo a, PhanSo b);
PhanSo operator -() const {return PhanSo(-tu,mau);}
friend istream& operator >> (istream &is, PhanSo &p);
friend ostream& operator << (ostream &os, PhanSo p);
Phep toan << va >> Phep toan << va >>
// phanso.cpp
#include <iostream.h>
#include phanso.h
istream & operator >> (istream &is, PhanSo &p)
{
is >> p.tu >> p.mau;
while (!p.mau)
{
cout << Nhap lai mau so: ;
is >> p.mau;
46
is >> p.mau;
}
p.UocLuoc();
return is;
}
ostream & operator << (ostream &os, PhanSo p)
{
os << p.tu;
if (p.tu != 0 && p.mau != 1)
os << "/" << p.mau;
return os;
}
Phep toan << va >> Phep toan << va >>
// tps.cpp
#include <iostream.h>
#include phanso.h
void main()
{
PhanSo a, b;
cout << Nhap phan so a: ; cin >> a;
47
cout << Nhap phan so b: ; cin >> b;
cout << a << " + " << b << " = " << a + b << "\n";
cout << a << " - " << b << " = " << a - b << "\n";
cout << a << " * " << b << " = " << a * b << "\n";
cout << a << " / " << b << " = " << a / b << "\n";
}
V du phep toan << va >>: Lop String V du phep toan << va >>: Lop String
class String
{
char *p;
public:
String(char *s = "") {p = strdup(s);}
String(const String &s2) {p = strdup(s2.p);}
~String() {delete [] p;}
48
String& operator = (const String& p2);
friend String operator +(const String &s1,
const String &s2);
friend istream& operator >> (istream &i,
String& s);
friend ostream& operator << (ostream &o, const
String& s);
};
V du phep toan << va >>: Lop String V du phep toan << va >>: Lop String
const MAX = 512;
istream & operator >> (istream &is, String& s)
{
char st[MAX];
is.getline(st,sizeof(s));
is.ignore();
s = st;
49
return is;
}
ostream & operator << (ostream &o, const String& s)
{
return o << s.p;
}
Phep toan << va >> Phep toan << va >>
lhop toun << vu >> cong co tho dooc dnh nghu vo
toun hung tho nhut thooc op dung xot, khong thooc op
ostroum houc stroum. 1rong troong hop do, tu dong hum
thunh phun. Koo tru vo u chnh do toong o vo tru do
co tho thoc hon phop toun on top.
Cuc v do vo so dong phop toun tron thoo cuch nuy u
cuc op Stuck, 1up hop, Dunh such, Mung, 1up tn
50
cuc op Stuck, 1up hop, Dunh such, Mung, 1up tn
Mang a;
a << 5 << 15; // bo 5 va 15 vao mang
V do suo mnh hou cuch so dong phop toun tron vo op
Stuck
Phep toan << va >> Phep toan << va >>
class Stack
{
Item *st, *top;
int size;
void Init(int sz) {st = top = new Item[size=sz];}
void CleanUp() {if (st) delete [] st;}
public:
51
Stack(int sz = 20) {Init(sz);}
~Stack() {CleanUp();}
static Stack *Create(int sz);
bool Full() const {return (top - st >= size);}
bool Empty() const {return (top <= st);}
bool Push(Item x);
bool Pop(Item *px);
Stack &operator << (Item x) {Push(x); return *this;}
Stack &operator >> (Item &x) {Pop(&x); return *this;}
};
Phep toan << va >> Phep toan << va >>
void main()
{
Stack s(10);
Item a,b,c,d,e;
a = b = c = d = e = 10;
s << 1 << 3 << 5 << 7;
52
s << 1 << 3 << 5 << 7;
s >> a >> b >> c >> d >> e;
cout << setw(4) << a << setw(4) << b <<
setw(4) << c << setw(4) << d << setw(4) << e
<< "\n";
}
Xout oo kh thoc hon doun choong trnh tron: :
5.2 Phep toan Iay phan tu mang: || 5.2 Phep toan Iay phan tu mang: ||
1u co tho dnh nghu phop toun || do troy xout phun to cou
mot do toong co y nghu mung.
class String
{
friend ostream& operator << (ostream &o, const
String& s);
char *p;
53
public:
String(char *s = "") {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
String & operator = (const String &s);
char & operator[](int i) {return p[i];}
};
Kot qou tru vo u thum choo do phun to tru vo co tho dong
o bon tru cou phop toun gun |vuoo).
Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: ||
Suo kh dnh nghu nho tron, co tho so dong do toong tru
vo o cu hu vo cou phop toun gun.
void main()
{
clrscr();
String a("Nguyen van A");
cout << a[7] << "\n"; // a.operator[](7)
54
cout << a[7] << "\n"; // a.operator[](7)
a[7] = 'V';
cout << a[7] << "\n"; // a.operator[](7)
cout << a << "\n";
}
1u co tho cu ton do phop toun tron co tho dooc so dong
un toun kh ch so khong hop o:
char *a = Dai hoc Tu nhien;
a[300] = H; // Nguy hiem
String aa(Dai hoc Tu nhien);
Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: ||
So dong phop toun tron nho gu tr tru |vuoo) vo ch so
khong hop o thoong guy ru nhong o kho tm vu sou. 1u
co tho khuc phoc bung cuch kom tru.
class String
{
char *p;
static char c;
55
static char c;
public:
String(char *s = "") {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
String & operator = (const String &s);
char & operator[](int i) {return (i >= 0 && i
< strlen(p)) ? p[i] : c;}
};
char String::c = 'A';
Phep toan Iay phan tu mang: || Phep toan Iay phan tu mang: ||
Suo kh dnh nghu nho tron, tu co tho yon tr gun vuo
cuc phun to co ch so khong hop o.
void main()
{
clrscr();
String a("Nguyen van A");
cout << a[7] << "\n";
56
cout << a[7] << "\n";
a[7] = 'V';
cout << a[7] << "\n";
cout << a[200] << "\n"; // Xuat String::c
a[200] = 'X'; // Gan String::c = 'X';
cout << a[300]; // Xuat String::c
}
lhop toun || dnh nghu nho tron co tho hout dong tot
cho cu hu troong hop: o bon tru vu bon phu phop toun
gun.
Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang
1oy nhon so dong phop toun || nho tron u khong hop o
do vo do toong hung.
void main()
{
clrscr();
String a("Nguyen van A");
const String aa("Dai Hoc Tu Nhien");
57
const String aa("Dai Hoc Tu Nhien");
cout << a[7] << "\n";
a[7] = 'V';
cout << a[7] << "\n";
cout << aa[4] << "\n";// Bao Loi: sai khai niem
aa[4] = 'L'; // Bao Loi: tot
cout << aa[4] << "\n";// Bao Loi: sai khai niem
cout << aa << "\n";
}
Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang
Lo tron dooc khuc phoc bung cuch dnh nghu mot phon
bun up dong dooc cho do toong hung.
class String
{
char *p;
static char c;
public:
58
public:
String(char *s = "") {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
String & operator = (const String &s);
char & operator[](int i) {return (i >= 0 && i <
strlen(p)) ? p[i] : c;}
char operator[](int i) const {return p[i];}
};
char String::c = 'A';
Phep toan || cho oi tuong hang Phep toan || cho oi tuong hang
Kh do voc so dong phop toun || do doc phun to th hop o
nhong co tnh gun so guy ru o su oc bon dch.
void main()
{
clrscr();
String a("Nguyen van A");
const String aa("Dai Hoc Tu Nhien");
59
const String aa("Dai Hoc Tu Nhien");
cout << a[7] << "\n";
a[7] = 'V';
cout << a[7] << "\n";
cout << aa[4] << "\n";
// String::operator[](int) const : Ok
aa[4] = 'L'; // Bao Loi: Khong the la lvalue
cout << aa[4] << "\n";
// String::operator[](int) const : Ok
cout << aa << "\n"; //
}
5.3 Phep toan goi ham: () 5.3 Phep toan goi ham: ()
lhop toun || ch co tho co mot thum so, v vuy dong phop
toun tron khong thoun ton kh tu moon uy phun to cou
mot mu trun hu choo. lhop toun go hum cho phop co
tho co so thum so but ky, v vuy thoun ton kh tu moon
troy xout phun to cou cuc do toong thooc ou mung hu
huy nhoo choo hon.
Lop mu trun suo duy dnh nghu phop toun |) vo hu thum
60
Lop mu trun suo duy dnh nghu phop toun |) vo hu thum
so, nho vuy tu co tho troy xout phun to cou mu trun thong
qou so dong vu so cot.
Phep toan goi ham Phep toan goi ham
class Matrix
{
int m,n;
double *px;
int DataSize(){return m*n*sizeof(double);}
void CopyData(double *pData)
{memcpy(px,pData,DataSize());}
void Create(int mm, int nn, double *pData = NULL);
61
void Create(int mm, int nn, double *pData = NULL);
public:
Matrix(int mm, int nn, double *_px)
{Create(mm,nn,_px);}
Matrix(const Matrix &m2){Create(m2.m,m2.n,m2.px);}
~Matrix() { delete [] px;}
Matrix operator = (const Matrix &m2);
double &operator()(int i, int j){return px[i*n+j];}
double operator()(int i, int j) const
{return px[i*n+j];}
Phep toan goi ham () Phep toan goi ham ()
Suo kh dnh nghu phop toun go hum nho tron, tu co tho
so dong mu trun nho mot mung hu choo.
void main()
{
double a[] = {1,2,3,4,5,6};
Matrix m(2, 3, a);
cout << "m = " << m << "\n";
62
cout << "m = " << m << "\n";
cout << m(1,2) << "\n"; // m.operator()(1,2)
m(1,2) = 50;
cout << m(1,2) << "\n";
}
lhop toun go hum cong dooc dong nho mot dung vun tut
thuy cho mot hum thunh phun thong thoong. Nho v do
suo, phop toun go hum hout dong toong doong vo hum
thunh phun SobStr do uy mot choo con.
Phep toan goi ham () Phep toan goi ham ()
class String
{
friend ostream& operator<<(ostream &o,const String& s);
char *p;
static char c;
public:
String(char *s = "") {p = strdup(s);}
63
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
String & operator = (const String &s);
void Output() const {cout << p;}
char & operator[](int i) {return (i >= 0 && i <
strlen(p)) ? p[i] : c;}
char operator[](int i) const {return p[i];}
String SubStr(int start, int count) const;
String operator()(int start, int count) const;
//...
Phep toan goi ham () Phep toan goi ham ()
String String::SubStr(int start, int count) const
{
char buf[512];
strncpy(buf, p+start, count); buf[count] = '\0';
return buf;
}
String String::operator()(int start, int count) const
64
{
char buf[512];
strncpy(buf, p+start, count); buf[count] = '\0';
return buf;
}
void main(){
String a("Nguyen van A");
cout << a.SubStr(7,3) << "\n";
cout << a(7,3) << "\n";
}
5.4 Phep toan tang va giam: ++ va 5.4 Phep toan tang va giam: ++ va
++ u phop toun mot ngo co vu tro tung gu tr mot do
toong on gu tr ko top. 1oong to u phop toun mot
ngo co vu tro gum gu tr mot do toong xoong gu tr
trooc do.
++ vu ch up dong cho cuc koo do oo dom dooc,
nghu u mo gu tr cou do toong doo co gu tr ko top
houc gu tr trooc do.
65
houc gu tr trooc do.
++ vu co tho dooc dong thoo hu cuch, top duo ngo
houc top v ngo.
Kh dong nho top duo ngo, ++u co hu vu tro:
Tang a len gia tr ke tiep.
Tra ve tham chieu en chnh a.
Kh dong nho top v ngo, u++ co hu vu tro:
Tang a len gia tr ke tiep.
Tra ve gia tr bang vi a trc khi tang.
Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va
Kh ch dnh nghu mot phon bun cou phop toun ++ |huy
) phon bun nuy so dooc dong cho cu hu troong hop:
top duo ngo vu top v ngo.
class ThoiDiem
{
long tsgiay;
static bool HopLe(int g, int p, int gy);
66
static bool HopLe(int g, int p, int gy);
public:
ThoiDiem(int g = 0, int p = 0, int gy = 0);
void Set(int g, int p, int gy);
int LayGio() const {return tsgiay / 3600;}
int LayPhut() const {return (tsgiay%3600)/60;}
int LayGiay() const {return tsgiay % 60;}
void Tang();
void Giam();
ThoiDiem &operator ++();
};
Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va
void ThoiDiem::Tang()
{
tsgiay = ++tsgiay%SOGIAY_NGAY;
}
void ThoiDiem::Giam()
{
if (--tsgiay < 0) tsgiay = SOGIAY_NGAY-1;
67
}
ThoiDiem &ThoiDiem::operator ++()
{
Tang();
return *this;
}
3.8 Phep toan tang va giam: ++ va 3.8 Phep toan tang va giam: ++ va
void main()
{
clrscr();
ThoiDiem t(23,59,59),t1,t2;
cout << "t = " << t << "\n";
t1 = ++t; // t.operator ++();
// t = 0:00:00, t1 = 0:00:00
68
cout << "t = " << t << "\tt1 = " << t1 << "\n";
t1 = t++; // t.operator ++();
// t = 0:00:01, t1 = 0:00:00
cout << "t = " << t << "\tt1 = " << t1 << "\n";
}
Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va
Do co tho co phop toun ++ vu hout dong khuc nhuo
cho hu cuch dong |++u vu u++) tu cun dnh nghu hu
phon bun ong vo hu cuch dong ko tron. lhon bun top
duo ngo co thom mot thum so gu do phun bot.
class ThoiDiem{
long tsgiay;
public:
69
public:
ThoiDiem(int g = 0, int p = 0, int gy = 0);
void Set(int g, int p, int gy);
int LayGio() const {return tsgiay / 3600;}
int LayPhut() const {return (tsgiay%3600)/60;}
int LayGiay() const {return tsgiay % 60;}
void Tang();
void Giam();
ThoiDiem &operator ++();
ThoiDiem operator ++(int);
};
Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va
void ThoiDiem::Tang()
{
tsgiay = ++tsgiay%SOGIAY_NGAY;
}
void ThoiDiem::Giam()
{
if (--tsgiay < 0) tsgiay = SOGIAY_NGAY-1;
}
70
}
ThoiDiem &ThoiDiem::operator ++()
{
Tang();
return *this;
}
ThoiDiem ThoiDiem::operator ++(int)
{
ThoiDiem t = *this;
Tang();
return t;
}
Phep toan tang va giam: ++ va Phep toan tang va giam: ++ va
void main()
{
clrscr();
ThoiDiem t(23,59,59),t1,t2;
cout << "t = " << t << "\n";
t1 = ++t; // t.operator ++();
// t = 0:00:00, t1 = 0:00:00
71
cout << "t = " << t << "\tt1 = " << t1 << "\n";
t1 = t++; // t.operator ++(int);
// t = 0:00:01, t1 = 0:00:00
cout << "t = " << t << "\tt1 = " << t1 << "\n";
}

You might also like